다음과 같이 파일에 일부 문자열을 추가해야 합니다.
이전 파일:
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)을 처리할 때 슬래시 뒤의 문자열을 보고 이를 사용하여 해시를 추출하고 현재 줄에 다시 넣습니다.