내가 해결하려는 문제를 해결하는 데 도움을 줄 수 있는 사람이 있나요? 현재 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
이걸 설명하고 싶은 사람은 없을 것 같아요.