![중첩된 [While, IF, Sed] 문의 다른 파일에 있는 줄과 일치하는 경우 줄을 바꿉니다.](https://linux55.com/image/156144/%EC%A4%91%EC%B2%A9%EB%90%9C%20%5BWhile%2C%20IF%2C%20Sed%5D%20%EB%AC%B8%EC%9D%98%20%EB%8B%A4%EB%A5%B8%20%ED%8C%8C%EC%9D%BC%EC%97%90%20%EC%9E%88%EB%8A%94%20%EC%A4%84%EA%B3%BC%20%EC%9D%BC%EC%B9%98%ED%95%98%EB%8A%94%20%EA%B2%BD%EC%9A%B0%20%EC%A4%84%EC%9D%84%20%EB%B0%94%EA%BF%89%EB%8B%88%EB%8B%A4..png)
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 줄을 F2
from 줄로 바꿔야 합니다. 아래의 이상한 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
NR == FNR {line[$1] = $0; next}
- 읽을 때F1
첫 번째 필드에 입력된 각 줄을 저장합니다.$1 in line {$0 = line[$1]}
--F2
지금 읽고 있습니다. 첫 번째 필드가 배열에 있으면line
배열 값을 현재 레코드로 바꿉니다.1
-- 현재 레코드를 인쇄합니다.