Pruebe todas las líneas en un archivo con awk y grep y, si coinciden, colóquelas en otro archivo.

Pruebe todas las líneas en un archivo con awk y grep y, si coinciden, colóquelas en otro archivo.

Aquí está mi archivo.test.csv

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

Me gustaría probar si el tercero se divide por | es francés (el francés puede estar en otra división, por lo que solo es la tercera) y coloque todas las líneas que coincidan con esto en otro archivo.

ejemplo :

bonjour|b|french;deutsch|french

french;deutschIgualalo

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

Respuesta1

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

Esto utiliza ambos |y ;como delimitadores de campo y realiza una comparación de cadenas entre el tercer campo y la cadena french. Si la cadena coincide, se genera la línea. Cualquier salida se redirige al archivo newfile.

Si usasolo |como delimitador, tendrías que probar con una expresión regular al inicio del tercer campo:

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

Esto detecta la cadena french;al comienzo del tercer campo y genera la línea si coincide.

Si frenchpuede ocurrir en cualquier parte del tercer |campo delimitado (por ejemplo, como dutch;french), entonces es posible que desees relajar un poco ese patrón y usarlo.

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

grepSería un poco incómodo usarlo aquí ya que es más difícil especificar exactamente |en qué campo delimitado debe coincidir:

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

Esto coincide con una cadena de caracteres alfabéticos (letras) seguida de un |carácter, dos veces, y luego la cadena french;.

Con una expresión regular extendida:

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

|Tenga en cuenta que es necesario escapar el ahora para que no se interprete como una alternancia.

Nuevamente, si frenchpuede aparecer en cualquier lugar dentro del tercer campo, necesitarás relajar un poco la expresión:

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

o,

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

Inserté [^|]*, que coincide con cualquier tramo de |caracteres que no sean antes de la palabra french(por ejemplo, la cadena dutch;), y eliminé el ;al final de la palabra (o podrías haberlo reemplazado ;por [;|]).

información relacionada