두 파일의 첫 번째 열을 비교하고 첫 번째 열이 일치하면 두 번째 파일의 전체 줄을 인쇄합니다.

두 파일의 첫 번째 열을 비교하고 첫 번째 열이 일치하면 두 번째 파일의 전체 줄을 인쇄합니다.

다음 형식의 파일이 두 개 있습니다.

파일 1:

air
smell
hand
dude
road
cat

파일 2:

air,4,21,01,13,3,2
smell,21,4,2,5,6
dude,1,31,42,1
road,1,4,2,1,4
cat,1,5,6,3,1
hand,1,4,2,1,6
mouse,1,3,5,6,2

내가 원하는 것은 파일 2의 열 1에 있는 첫 번째 문자열이 파일 1에 있는 경우 파일 2의 전체 줄을 인쇄하고 파일 1의 순서를 유지하고 싶습니다.

예상 출력:

air,4,21,01,13,3,2
smell,21,4,2,5,6
hand,1,4,2,1,6
dude,1,31,42,1
road,1,4,2,1,4
cat,1,5,6,3,1

답변1

이렇게 하면 트릭을 수행할 수 있습니다.

awk -F, 'FNR==NR {a[$1]; next}; $1 in a' file1 file2

편집하다:

잘못된 주문 문서에 대한 설명입니다. 새로운 시도( gawk허용되는 경우 필수)

gawk -F, '
    FNR==NR {a[NR]=$1; next}; 
    {b[$1]=$0}
    END{for (i in a) if (a[i] in b) print b[a[i]]}
' file1 file2

편집 2:

nowmal awk및 스왑 파일을 사용하십시오.

awk -F, 'FNR==NR {a[$1]=$0; next}; $1 in a {print a[$1]}' file2 file1

답변2

join -t, -1 2 -2 1 <(nl -s, -ba -nrz file1 | sort -t, -k2) \
<(sort -t, -k1 file2) | sort -t, -k2 | cut -d, -f1,3-

의 행에는 file1번호가 매겨지고 결과는 sort두 번째 필드에서 편집됩니다. 그런 다음 다음 join과 같이 편집합니다 file2( sort첫 번째 필드에서 편집).

air,000001,4,21,01,13,3,2
cat,000006,1,5,6,3,1
dude,000004,1,31,42,1
hand,000003,1,4,2,1,6
road,000005,1,4,2,1,4
smell,000002,21,4,2,5,6

그런 다음 sort두 번째 필드(즉, 행 번호)의 결과를 편집하여 원래 행 순서를 복원한 다음 다음을 사용하여 동일한 두 번째 필드를 삭제합니다 cut.

air,4,21,01,13,3,2
smell,21,4,2,5,6
hand,1,4,2,1,6
dude,1,31,42,1
road,1,4,2,1,4
cat,1,5,6,3,1

답변3

간단한 grep 명령을 사용할 수 있습니다.

grep -f file1 file2

관련 정보