한 파일의 텍스트를 다른 파일의 텍스트로 바꾸기

한 파일의 텍스트를 다른 파일의 텍스트로 바꾸기

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에서 반환되는 경우 현재 레코드를 계속 인쇄하는지 확인하세요. 읽기에 실패하면 수정이 이루어지지 않습니다 .EOFafter.txt||1$0after.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

관련 정보