중첩된 [While, IF, Sed] 문의 다른 파일에 있는 줄과 일치하는 경우 줄을 바꿉니다.

중첩된 [While, IF, Sed] 문의 다른 파일에 있는 줄과 일치하는 경우 줄을 바꿉니다.

F1다음 형식으로 한 줄에 8개의 필드가 있는 17k 줄 길이의 파일이 있습니다 .

id1 field2 field3 field4 field5 field6 field7 field8
id2 field2 field3 field4 field5 field6 field7 field8

두 번째 파일 F2내용은 행(열)당 단일 필드로 확장됩니다.

id1
uuuuuuu
bbbbbbb
aaaaaaa
id2
ttttttt
qqqqqqq
...

일치하는 항목이 있으면 from 줄을 F2from 줄로 바꿔야 합니다. 아래의 이상한 while 루프가 작동할 것이라고 생각했지만 말할 필요도 없이 F1매번 변경된 모든 행을 반환합니다. F2아니면 Bash에 이 작업을 수행할 수 있는 다른 마법 도구가 있을 수도 있나요?

while read id1 id2 id3 id4 id5; do
        while read ID; do
                if [[ $ID == "$id1" ]]; then
                        sed "s/$ID/$id1 $id2 $id5 $id4/" F2 && break
                fi
        done < F2
done < F1

답변1

이건 직업이야

awk 'NR == FNR {line[$1] = $0; next} $1 in line {$0 = line[$1]} 1' F1 F2 
  1. NR == FNR {line[$1] = $0; next}- 읽을 때 F1첫 번째 필드에 입력된 각 줄을 저장합니다.
  2. $1 in line {$0 = line[$1]}-- F2지금 읽고 있습니다. 첫 번째 필드가 배열에 있으면 line배열 값을 현재 레코드로 바꿉니다.
  3. 1-- 현재 레코드를 인쇄합니다.

관련 정보