File1의 패턴을 File2의 해당 일치 패턴 + 열로 바꿉니다.

File1의 패턴을 File2의 해당 일치 패턴 + 열로 바꿉니다.

비슷한 Q&A를 많이 살펴봤지만 여전히 해결책이 없습니다.

2개의 파일이 있습니다.

파일 1

cow
aaaaa
brown
bbbbb
often
ccccc
farts
ddddd

파일 2

File2에서는 "space"를 구분 기호로 사용한 다음 col 1="brown" 및 col2="149,456,foo"를 사용합니다. 또한 File1과 File2의 순서가 다릅니다(여기에서는 정렬이 작동하지 않습니다. 교체를 위해 일치하는 키에 의존하고 싶습니다).

brown 149,456,foo
cow 192,231,bar
farts 81,2007,tip
often 427,541,top

파일 3을 만들고 싶습니다.

cow 192,231,bar
aaaaa
brown 149,456,foo
bbbbb
often 427,541,top
ccccc
farts 81,2007,tip
ddddd

즉, File2의 column1(갈색)을 기록하고 File1에서 검색합니다. File1에서 일치 항목이 발견되면 일치 항목을 해당 File2의 전체 줄(갈색 149,456,foo)로 바꿉니다.

나는 이것을 시도했습니다 :

$ awk 'NR==FNR{a[NR]=$0;next}{$6=a[FNR]}1' file2 file1

그러나 결과는 각 row1을 가져온 다음 다른 파일의 row1과 함께 인쇄하는 것으로 보이며 일치/교체가 필요하지 않습니다.

brown     brown 149,456,foo
aaaa     cow 192,231,bar
cow     farts 81,2007,tip
bbbbb     often 427,541,top
farts     
ccccc     
often     
ddddd 

awk나 sed를 사용하고 싶습니다. 어떤 조언이라도 미리 감사드립니다!

답변1

노력하다:

$ awk 'FNR==NR{a[$1]=OFS $2;next} {print $0 a[$1]}' file2 file1
cow 192,231,bar
aaaaa
brown 149,456,foo
bbbbb
often 427,541,top
ccccc
farts 81,2007,tip
ddddd

어떻게 작동하나요?

  1. FNR==NR{a[$1]=OFS $2;next}

    file2명령줄의 첫 번째 파일을 읽을 때 a첫 번째 필드의 키 아래 연관 배열에 항목을 추가합니다 $1. 항목은 출력 필드 구분 기호 OFS와 두 번째 필드로 구성됩니다 $2. 그런 다음 나머지 명령을 건너뛰고 다시 시작합니다 next.

  2. 인쇄$0 a[$1]

    file1명령줄의 두 번째 파일을 읽는 동안 각 줄을 인쇄한 다음 a해당 줄의 배열 값을 인쇄합니다.

관련 정보