이전 명령의 변수를 기반으로 awk 또는 sed를 사용하여 파일에서 줄 삭제

이전 명령의 변수를 기반으로 awk 또는 sed를 사용하여 파일에서 줄 삭제

문자열과 숫자가 포함된 CSV 파일(예: temp.csv)이 있습니다. 파일의 줄 시작 부분에 특정 문자열 패턴이 포함된 줄을 삭제해야 합니다. 예를 들어, 여기 내 파일이 있습니다.

req1,incl_patt1,excl_patt1,2,ind1
req1,incl_patt2,excl_patt2,1,ind1
req1,incl_patt3,excl_patt3,4,ind1
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4

req_file_curr명령에 패턴을 쓰고 있습니다~ $ req_file_curr=req1

echo "${req_file_curr}"다음과 같이 출력을 제공합니다.req1

그러나 그것을 사용할 때sed아래와 같이 명령을 내립니다.

sed '/\"${req_file_curr}\"/d' temp.csv

다음과 같이 출력을 제공합니다.

req1,incl_patt1,excl_patt1,2,ind1
req1,incl_patt2,excl_patt2,1,ind1
req1,incl_patt3,excl_patt3,4,ind1
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4

나는 다음과 같이 출력을 기대하고 있습니다.

req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4

쉘의 변수를 찾을 패턴으로 어떻게 사용할 수 있습니까?sed또는awk?

답변1

sed쉘이 변수를 전달하기 전에 확장할 수 있도록 패턴을 큰따옴표로 묶어야 합니다 sed.

sed "/^${req_file}/d" temp.csv

또한 이 패턴이 줄의 시작 부분에서 발생해야 함을 ^나타내기 위해 앵커를 사용해야 합니다 .sed

답변2

awk또는 여기에는 필요하지 않습니다 sed.

grep -v "^$req_file_curr," file

(예: for sed또는 awk정도는 낮지만) $req_file_curr정규식 연산자(예: ., *...)가 포함되어 있지 않다고 가정합니다.

그렇다면 해당 문자를 이스케이프해야 합니다. 또는 를 사용하면 awk해당 기능을 사용하는 접근 방식을 사용할 수 있습니다 index().

S="$req_file_curr," awk 'index($0, ENVIRON["S"]) != 1' < file

답변3

설정했지만 req_file_curr사용하십시오 req_file. 그리고 sed명령에서 쉘 변수를 확장할 수 없기 때문에 명령이 작동하지 않습니다 sed.

다음을 시도해 볼 수 있습니다.

$ sed '/'"${req_file_curr}"'/d' file
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4

sed또는 큰따옴표와 함께 사용 :

sed "/${req_file_curr}/d" file

그리고 사용 awk:

$ awk -v req=$req_file_curr '$0 !~ req' file
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4

답변4

교육 솔루션은 다음과 같습니다.

  req_file_curr=req1

  printf '%s\n' "g/^$req_file_curr/d"  w | ed -s temp.csv

파일을 내부에서 편집하므로 파일에 대해 이를 실행하기 전에 먼저 테스트하십시오.

관련 정보