sed - file1을 사용하여 file2에 포함된 file3 행의 대체 내용을 찾습니다.

sed - file1을 사용하여 file2에 포함된 file3 행의 대체 내용을 찾습니다.

저는 이곳에 처음 왔고 아직 포스팅을 많이 하지 않았습니다. 그 점을 분명히 하려고 노력하겠습니다.

문자열이 포함된 행을 식별하는 find.csv라는 세 개의 파일과 관련된 찾기 및 바꾸기를 수행하고 싶습니다. 전체 행을 replacement.csv의 한 행으로 바꾸고 싶습니다. 세 번째 파일은 mainfile.csv이며 약 1000줄이 포함되어 있습니다.

이것이 지금까지의 내용이지만 오류 메시지가 나타납니다.

sed "s/$(cat find.csv)/$(cat replace.csv)/" mainfile.csv > out.csv
sed: 1: "s/CHL_13_R4 
DCK_09_R4  ...": unterminated substitute pattern

해당 파일의 내용은 다음과 같습니다.

find.csv
CHL_13_R4 
DCK_09_R4 
DCK_10_R4 
DCK_11_R4 
DCK_13_R4 

replace.csv
CHL_13_R12,CHL_13,R12,10/14/2014
DCK_09_R12,DCK_09,R12,10/14/2014
DCK_10_R32,DCK_10,R32,10/14/2014
DCK_11_R21,DCK_11,R21,10/14/2014

기본 파일에는 replacement.csv와 동일한 항목이 포함되어 있지만 약 30개를 업데이트해야 합니다. 따라서 첫 번째 행을 예로 들어 보겠습니다. mainfile.csv에서 "CHL_13_R4"가 있는 행을 CHL_13_R12,CHL_13,R12,10/14/2014로 바꿔야 합니다.

도와주셔서 감사합니다!

답변1

먼저 다음 두 파일에서 sed 스크립트를 만듭니다.

paste -d$'\t' find.csv replace.csv | 
    sed -e 's:/:\\/:g; s:\t:/:; s:^:s/:; s:$:/g;:' > myscript.sed

그러면 해당 문자열의 모든 항목이 find.csv의 문자열로 대체됩니다 replace.csv. 줄에 탭 문자가 포함되어 있으면 해당 문자가 결합된 줄 사이의 구분 기호 find.csv로 사용되기 때문에 실패합니다 .paste

출력은 다음과 같습니다.

s/CHL_13_R4/CHL_13_R12,CHL_13,R12,10\/14\/2014/g;
s/DCK_09_R4/DCK_09_R12,DCK_09,R12,10\/14\/2014/g;
s/DCK_10_R4/DCK_10_R32,DCK_10,R32,10\/14\/2014/g;
s/DCK_11_R4/DCK_11_R21,DCK_11,R21,10\/14\/2014/g;
s/DCK_13_R4//g;

(마지막 행은 대체되지 않습니다. 이는 find.csv5개의 행이 있고 replace.csv4개만 있기 때문입니다.)

다음 문자열을 포함하는 전체 줄을 바꾸려면 다음을 수행하십시오 find.csv.

paste -d$'\t' find.csv replace.csv | 
    awk -F$'\t' '{gsub(/\//,"\\/"); print "/"$1"/ s/^.*/"$2"/;"}' > myscript.sed

이 버전의 출력은 다음과 같습니다.

/CHL_13_R4/ s/^.*/CHL_13_R12,CHL_13,R12,10\/14\/2014/;
/DCK_09_R4/ s/^.*/DCK_09_R12,DCK_09,R12,10\/14\/2014/;
/DCK_10_R4/ s/^.*/DCK_10_R32,DCK_10,R32,10\/14\/2014/;
/DCK_11_R4/ s/^.*/DCK_11_R21,DCK_11,R21,10\/14\/2014/;
/DCK_13_R4/ s/^.*//;

어쨌든, 가장 적합한 버전이 무엇이든 myscript.sed스크립트를 생성한 후 다음 폴더에 넣으세요 mainfile.csv.

sed -f myscript.sed mainfile.csv

-i("in-place"를 편집하려는 경우 선택 사항 mainfile.csv)

참고: 임시 파일(예: 스크립트 저장)을 사용하지 않고도 이 작업을 수행할 수 있습니다 myscript.sed. 대부분의 sed 버전은 표준 입력에서 스크립트를 실행할 수 있습니다. 하지만 이 방법을 사용하면 생성된 sed 스크립트를 기본 파일에서 실행하기 전에 검사 및/또는 편집할 수 있습니다.

관련 정보