Estoy consultando un archivo con el otro archivo y los tengo de la siguiente manera:
Archivo1:
Angela S Darvill| text text text text Helen Stanley| text text text text Carol Haigh S|text text text text .....Archivo2:
Carol Haigh Helen Stanley Angela DarvillEste comando:
awk 'NR==FNR{_[$1];next} ($1 in _)' File2.txt File1.txtdevuelve líneas que se superponen, PERO no tiene una coincidencia estricta. Teniendo una coincidencia estricta, solo Helen Stanley debería haber sido devuelta.
¿Cómo restringes awk en una superposición estricta?
Con sus muestras mostradas, intente seguir. Estaba en el camino correcto, debe hacer 2 cosas, la primera: tomar la línea completa como a índice en la matriz mientras lee file2.txt y establecer el campo seapeator en | antes de que awk comience a leer el archivo 1
awk -F'|' 'NR==FNR{a[$0];next} $1 in a' File2.txt File1.txtEl comando anterior no funciona para mí (estoy en Mac, no sé si importa), pero
awk 'NR==FNR{_[$0];next} ($1 in _)' File2.txt. FS="|" File1.txtfuncionado bien
También puede usar grep para hacer coincidir desde File2.txt como una lista de expresiones regulares para hacer una coincidencia exacta.
Puedes usar sed para preparar los partidos. Aquí hay un ejemplo:
sed -E 's/[ \t]*$//; s/^(.*)$/^\1|/' File2.txt ^Carol Haigh| ^Helen Stanley| ^Angela Darvill| ... Luego use el proceso con ese sed como un argumento -f para grep :
grep -f <(sed -E 's/[ \t]*$//; s/^(.*)$/^\1|/' File2.txt) File1.txt Helen Stanley| text text text text Dado que su ejemplo File2.txt tiene espacios finales, el sed tiene s/[ \t]*$//; como primera sustitución. Si su archivo real no tiene esos espacios comerciales, puede hacer lo siguiente:
grep -f <(sed -E 's/.*/^&|/' File2.txt) File1.txt Ed Morton menciona un buen punto de que grep aún interpretará los metacaracteres RE en File2.txt . Puede usar el indicador -F para que solo se usen cadenas literales:
grep -F -f <(sed -E 's/.*/&|/' File2.txt) File1.txt