before.txt
다음 내용이 포함된 파일이 있다고 가정해 보겠습니다 .
1
2
3
4
4
그러나 숫자를 .txt 라는 텍스트 파일의 숫자(순서대로)로 바꾸고 싶습니다 after.txt
. 어떻게 해야 하나요?
after.txt
포함하다:
2743
3028
2850
1092
etc.
이것도 스크립트로 바꿀 수 있나요? 그렇다면 모든 문자열을 순서대로 반복하고 after.txt
위와 같이 문자열을 교체하고 싶습니다 .4
답변1
awk '/^4$/&&getline<"after.txt"||1' before.txt
현재 레코드가 $0
정확히 text 이면 4
에서 다음 줄을 가져옵니다 after.txt
. 성공하면 1이 되어 $0
반환 getline
되므로 식이 true이고 {print}
기본 작업이 트리거됩니다.
레코드가 가 아니 4
거나 getline이 of 0
에서 반환되는 경우 현재 레코드를 계속 인쇄하는지 확인하세요. 읽기에 실패하면 수정이 이루어지지 않습니다 .EOF
after.txt
||1
$0
after.txt
getline
실패 하더라도 0이 아닌 반환 코드이기 때문에 -1
계속 인쇄됩니다 .$0
답변2
다음 파일이 주어지면:
cat before.txt
1
2
3
4
1
1
2
3
4
2
3
4
cat after.txt
2743
3028
2850
1092
그리고 이 작은 스크립트는 다음과 같습니다.
#!/bin/bash
while read -r line; do
if [[ "$line" == 4 ]]; then
sed -n '1p' after.txt
sed -i".bup" '1d' after.txt
else
echo "$line"
fi
done < before.txt
나는 다음과 같은 결과를 얻습니다.
./script.sh
1
2
3
2743
1
1
2
3
3028
2
3
2850
이 작업을 수행하는 oneliner 가 있다고 확신 awk
하지만 유창하지 않습니다 awk
! 또한 파일을 대체("제자리")하려면 루프의 명령문을 before.txt
변경해야 합니다 . sed
그렇지 않으면 간단히 STDOUT
새 파일로 리디렉션할 수 있습니다. 이 경우에는 STDOUT
더 쉽게 볼 수 있도록 모든 내용을 인쇄하기로 결정했습니다.
테스트 중OSX 10.11.6그리고 BSDsed
답변3
awk에도 비슷한 것이 있나요?
$ awk 'NR==FNR{Arr[NR]=$0;next}{if($0==4){i++;print Arr[i]}else{print}}' after.txt before.txt
1
2
3
2743
1
1
2
3
3028
2
3
2850