awk는 파일에서 문자열을 검색합니다.

awk는 파일에서 문자열을 검색합니다.

나는 현재 사용하고 있습니다

 $ awk 'NR==FNR{a[$1];next} ($3 in a)' find.txt path_to_100_files/*

find.txt 문자열을 사용하여 path_to_100_files/에 있는 여러 파일에서 일치하는 항목을 검색합니다.

find.txt에는 다음이 포함됩니다.

[email protected]
[email protected]

그런 다음 path_to_100_files/에는 파일이 포함됩니다.

0.0.0.0:002921931:[email protected]
123.0.0.1:00029382:[email protected]

지금은 find.txt의 문자열에 대한 세 번째 열을 검색하는 것뿐입니다. 하지만 전체 파일/각 열을 검색하려면 이 검색이 필요합니까?

일부 파일의 길이는 5열 또는 9열일 수 있습니다. 예를 들어,

0.0.0.0:002921931:1111111:[email protected]
123.0.0.1:00029382:1111111:11111:[email protected]

($3 in a)를 ($0-$9 in a)로 변경하려고 시도했지만 작동하지 않는 것 같나요?

답변1

왜 필드를 하나씩 검색합니까? 한 번에 전체 행을 검색하면 어떨까요?

grep -f find.txt path_to_100_files/*

답변2

이메일이 100개 파일의 마지막 필드인 경우 다음을 사용하세요.

awk -F: 'NR==FNR{a[$1];next} ($NF in a)' find.txt path_to_100_files/*

각 필드를 살펴봐야 하는 경우 루프가 필요합니다.

awk -F: 'NR==FNR{a[$1];next} {for (i=1;i<=NF;i++) {if ($i in a) {print;break}}} find.txt path_to_100_files/*

그러나 더 간단한 호출은 grep을 사용하는 것입니다.

grep -oFf find.txt path_to_100_files/*

답변3

먼저 파일에 있는 최대 열을 찾고 다음 명령을 사용하여 최대값을 가져옵니다.

k=`awk -F ":" '{print NF}'  path_to_100_files/*  | sort -nr | head -1`

for 루프를 사용하여 각 열을 확인하세요.

for ((i=0;i<=$k;i++)); do awk -v i="$i" -F ":" 'NR==FNR {a[$1];next}($i in a) {print }’   find.txt path_to_100_files/*   ; done

관련 정보