SED 또는 AWK를 사용하여 한 파일의 값을 다른 파일로 대체

SED 또는 AWK를 사용하여 한 파일의 값을 다른 파일로 대체

내가 해결하려는 문제를 해결하는 데 도움을 줄 수 있는 사람이 있나요? 현재 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 솔루션:

  1. sed를 사용하여 FILE_A를 sed 명령으로 변환
  2. 이 코드를 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

이걸 설명하고 싶은 사람은 없을 것 같아요.

관련 정보