teste todas as linhas em um arquivo com awk e grep e se corresponder, coloque-as em outro arquivo

teste todas as linhas em um arquivo com awk e grep e se corresponder, coloque-as em outro arquivo

Aqui está meu arquivotest.csv

bonjour|b|french;deutsch|french
hello|h|english;russian|french
gutentag|g|german;polish|french
ciao|i|italian|french

Gostaria de testar se a terceira divisão por | é francês (francês pode estar em outra divisão, então apenas a terceira) e coloque todas as linhas que correspondam a isso em outro arquivo.

exemplo :

bonjour|b|french;deutsch|french

french;deutschcombine

Algo comoawk -F | '$3=="french"' file

Responder1

awk -F '[|;]' '$3 == "french"' file >newfile

Isso usa |e ;como delimitadores de campo e faz uma comparação de string entre o terceiro campo e a string french. Se a string corresponder, a linha será exibida. Qualquer saída é redirecionada para o arquivo newfile.

Se estiver usandoapenas |como delimitador, você teria que testar com uma expressão regular no início do terceiro campo:

awk -F '|' '$3 ~ /^french;/' file >newfile

Isso detecta a string french;no início do terceiro campo e gera a linha se ela corresponder.

Se frenchpuder ocorrer em qualquer lugar no terceiro |campo delimitado (por exemplo, como dutch;french), então você pode querer relaxar um pouco esse padrão e usar

awk -F '|' '$3 ~ /french/' file >newfile

grepseria um pouco estranho de usar aqui, pois é mais difícil especificar exatamente em qual |campo delimitado corresponder:

grep '^\([[:alpha:]]\{1,\}|\)\{2\}french;' file >newfile

Isso corresponde a uma sequência de caracteres alfabéticos (letras) seguida por um |caractere, duas vezes, e depois pela string french;.

Com uma expressão regular estendida:

grep -E '^([[:alpha:]]+\|){2}french;' file >newfile

Observe que o |now precisa ser escapado para não ser interpretado como uma alternância.

Novamente, se frenchpuder ocorrer em qualquer lugar dentro do terceiro campo, você precisará relaxar um pouco a expressão:

grep '^\([[:alpha:]]\{1,\}|\)\{2\}[^|]*french' file >newfile

ou,

grep -E '^([[:alpha:]]+\|){2}[^|]*french' file >newfile

Eu inseri [^|]*, que corresponde a qualquer trecho de não |caracteres antes da palavra french(por exemplo, a string dutch;), e removi o ;no final da palavra (ou você poderia ter substituído o ;by [;|]).

informação relacionada