awk: Como usar diferentes separadores de campo e operar em colunas diferentes [closed]

0

Para vários arquivos, estou tentando extrair colunas contendo uma string específica, mas os separadores de campo nos arquivos são diferentes, e a string aparecerá em uma coluna diferente, dependendo do arquivo.

Exemplo de linha no arquivo 1 (o delimitador é : ):

sss:string1:rrr

Exemplo de linha no arquivo 2 (o delimitador é , ):

sss,sss,string321,sss,sss

Exemplo de linha no arquivo 3 (o delimitador é ' ):

example'e123'string2'lol

Como eu poderia encontrar "string" nos três arquivos acima usando awk ou outra ferramenta de linha de comando?

Eu sei que, para file 1 , eu poderia realizar:

awk -F: '$2 ~ /string/ {print $2}'

e a saída seria:

string1

ainda quero fazer isso para vários arquivos com vários separadores e várias colunas, porque cada arquivo individualmente seria muito demorado? É possível fazer?

    
por Uni VPS 22.03.2018 / 02:04

2 respostas

2

Fazendo 3 chamadas separadas:

awk -F: '{print $2}' file1
awk -F, '{print $3}' file2
awk -F\' '{print $3}' file3

provavelmente será tão rápido quanto algo como

awk '
    FILENAME == "file1" && FNR == 1 {FS = ":"; col = 2; $0 = $0}
    FILENAME == "file2" && FNR == 1 {FS = ","; col = 3; $0 = $0}
    FILENAME == "file3" && FNR == 1 {FS = "'\''"; col = 3; $0 = $0}
    {print $col}
' file1 file2 file3

Certamente, o primeiro é mais fácil de ler e manter.

Como o Zen do Python diz, simples é melhor que complexo.

    
por 22.03.2018 / 02:50
0

Se você quiser fazer um comando, o seguinte funcionará:

awk -F : '{print $2}' file1 && awk -F : '{print $3}' file2 && awk -F : '{print $3}' file3

Isso gerará:

string1
string321
string2

Se você quiser apenas imprimir string e nada incluído, então:

awk -F : '{print substr($2,1,6)}' file1 && awk -F , '{print substr($3,1,6)}' file2 && awk -F \' '{print substr($3,1,6)}' file3

Para explicar:

substr($2,1,6) imprime uma subcadeia do 2º campo, começando na 1ª posição com 6 dos caracteres de string . A saída será

string
string
string
    
por 22.03.2018 / 04:56

Tags