루프에서 문자열 바꾸기

루프에서 문자열 바꾸기

다음과 같이 파일에 일부 문자열을 추가해야 합니다.

이전 파일:

Real/Test1
Real/Test1
Real/Test2
Real/Test3
Real/Test3
Real/Test4

새로운 파일:

Real/Test1  a1 b1 c1 d1
Real/Test1  a1 b1 c1 d1
Real/Test2  a2 b2 c2 d2
Real/Test3  a3 b3 c3 d3
Real/Test3  a3 b3 c3 d3
Real/Test4  a4 b4 c4 d4

열 1에 이전 문자열이 포함된 중간 파일이 있고 아래와 같이 새 문자열이 포함되어 있습니다.

Test1 a1 b1 c1 d1
Test2 a2 b2 c2 d2
Test3 a3 b3 c3 d3
Test4 a4 b4 c4 d4

이 문제를 해결하는 데 도움을 줄 수 있는 사람이 있나요?

나는 매우 원시적인 지식을 가지고 다음을 시도했습니다.

(n1 n2를 동시에 읽고 set n1 n2 sed -i "s/$n1/$n1 $n2/g" old > 최종적으로 완료됨)

여기서 "오래된" 입력과 "중간" 입력은 위에서 언급한 것입니다.

감사합니다!

답변1

파일이 연결된 필드의 순서로 정렬된 것으로 나타나므로 join명령을 상당히 쉽게 사용할 수 있습니다.

join old <(sed 's;^;Real/;' intermediate)

또는 (쉘이 프로세스 대체를 지원하지 않는 경우)

sed 's;^;Real/;' intermediate | join old -

전임자.

$ sed 's;^;Real/;' intermediate | join old -
Real/Test1 a1 b1 c1 d1
Real/Test1 a1 b1 c1 d1
Real/Test2 a2 b2 c2 d2
Real/Test3 a3 b3 c3 d3
Real/Test3 a3 b3 c3 d3
Real/Test4 a4 b4 c4 d4

답변2

GNU awk를 사용하여 다음과 같이 시도해 보십시오.

awk -F"[/ ]" 'NR==FNR {a[$1]=$2OFS$3OFS$4;next}$2 in a {print $0,a[$2]}'  intermediatefile oldfile >newfile

답변3

perl -lne '
   @ARGV and $h{$1}=s/(\S+)//r,next;
   s|/(\S+)\K|$h{$1}|;print;
' intermediate.file old.file

결과

Real/Test1 a1 b1 c1 d1
Real/Test1 a1 b1 c1 d1
Real/Test2 a2 b2 c2 d2
Real/Test3 a3 b3 c3 d3
Real/Test3 a3 b3 c3 d3
Real/Test4 a4 b4 c4 d4

설명하다

  • 중간 파일(@ARGV > 0)을 사용하여 첫 번째 필드를 키로 사용하고 나머지 필드를 해당 값으로 사용하여 해시를 채웁니다.
  • 이전 파일(@ARGV = 0)을 처리할 때 슬래시 뒤의 문자열을 보고 이를 사용하여 해시를 추출하고 현재 줄에 다시 넣습니다.

관련 정보