![SED 또는 AWK를 사용하여 한 파일의 값을 다른 파일로 대체](https://linux55.com/image/210788/SED%20%EB%98%90%EB%8A%94%20AWK%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%ED%95%9C%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EA%B0%92%EC%9D%84%20%EB%8B%A4%EB%A5%B8%20%ED%8C%8C%EC%9D%BC%EB%A1%9C%20%EB%8C%80%EC%B2%B4.png)
내가 해결하려는 문제를 해결하는 데 도움을 줄 수 있는 사람이 있나요? 현재 2개의 파일을 작업 중입니다. 파일의 내용은 값이 다음과 같은 2개의 열로 구성된 목록에 있습니다.
파일_A.txt:
1 MSFT
2 YHOO
3 GOOG
4 APPL
5 SUN
파일_B.txt:
### Client A ###
1
2
3
### Client B ###
2
3
4
5
++++
나는 대체 방법을 사용하여 1이 발생할 때마다 파일 B의 값을 MFST로 변경하려고 합니다. 파일 B에서 2가 나타날 때마다 값을 YHOO로, 3을 GOOG로 변경합니다.
현재 내가 할 수 있는 유일한 방법은 대화형 sed를 사용하여 수동적이고 긴 프로세스를 이용하는 것입니다. 사용할 수 있는 반복 구문이 있나요?
sed -i 's/\1\>/MSFT/g' FILE_B.txt
매우 감사합니다
답변1
그렇게요?
awk 'NR==FNR{a[$1]=$2} NR!=FNR{if($1 in a){$1=a[$1]};print}' File_A.txt FILE_B.txt
### Client A ###
MSFT
YHOO
GOOG
### Client B ###
YHOO
GOOG
APPL
SUN
이것이 효과가 있다면 출력을 tmp 파일로 리디렉션한 다음 FILE_B.txt를 통해 tmp 파일을 mv하십시오. sponge
설치되어 있으면 다음을 수행할 수 있습니다.
awk 'NR==FNR{a[$1]=$2} NR!=FNR{if($1 in a){$1=a[$1]};print}' File_A.txt FILE_B.txt | sponge FILE_B.txt
답변2
ㅏ정말 무섭다sed 솔루션:
- sed를 사용하여 FILE_A를 sed 명령으로 변환
- 이 코드를 FILE_B에 적용하세요.
sed "$(sed 's/^/s!^/;s/ /$!/;s/$/!/' FILE_A.txt)" FILE_B.txt
답변3
순수주의자로서 나는 단일 솔루션을 사용하는 것을 선호 sed
하지만 일부 사람들은 이것을 읽을 수 없다고 생각할 수도 있습니다.
sed '/^[0-9]* /{H;d;};G;s/^\([0-9]*\)\n.*\n\1 \([A-Z]*\).*/\2/;P;d' FILE_A.txt FILE_B.txt
이걸 설명하고 싶은 사람은 없을 것 같아요.