sed 또는 awk 기반 실행 명령을 사용하여 특정 줄을 바꾸는 방법

sed 또는 awk 기반 실행 명령을 사용하여 특정 줄을 바꾸는 방법

다음과 같은 CSV 파일이 있습니다.

site1.com,aaa,bbb,ccc
site2.com,qqq
site3.com,rrr,uuu,ppp
site4.com
site5.com,ddd,sss

행(행)을 빈 네 번째 열로 바꾸고 싶습니다. 나는 명령을 실행하여 이 라인을 조작하고 싶습니다. 예를 들어 다음을 사용합니다 awk.

awk -F, '$4=="" {system("$1,cmd1 $1")}' test.csv

그런 다음 다음과 같이 내보내고 싶습니다(output1은 cmd1 명령의 출력입니다).

site1.com,aaa,bbb,ccc
site2.com,output1
site3.com,rrr,uuu,ppp
site4.com,output1
site5.com,output1

답변1

awk -F, -v q=\' '
  function shellquote(s) {
    gsub(q, q "\\" q q, s)
    return q s q
  }
  $4 == "" {
    printf "%s,", $1
    system("cmd " shellquote($1))
    next
  }
  {print}'

shellquote부분이 중요합니다. 예를 들어 $1값이 비슷한 경우를 생각해 보세요.;reboot

답변2

awk -F, '{ if ( $4 == "" ){printf "%s,",$1 ; system(CMD) ;}else {print $0}}' test.csv

네 번째 필드가 비어 있으면 첫 번째 필드와 명령 출력을 인쇄하고, 그렇지 않으면 구멍 선을 인쇄합니다.

그러나 명령의 출력이 어떻게 인쇄되는지 참고하십시오.

답변3

다음 코드를 사용할 수 있습니다.

awk -v output1="$(cmd1)" 'BEGIN{FS=OFS=","} NF&&NF<4{print $1,output1}1' file

이 옵션은 -v변수를 output1쉘 명령의 결과로 설정합니다 cmd1.

이 명령문은 BEGIN{FS=OFS=","}구분 기호를 쉼표로 설정합니다.

행이 비어 있지 않고 필드 수가 4개 미만인 경우 행을 바꿉니다.

마지막으로 1기본 문이 실행됩니다 awk. 전체 줄을 인쇄합니다.

답변4

sed -rn '
/\S+,\S+,\S+,\S+/{p;b}      # if all four columns exist, print and branch to end
s/^([^,]+).*/\1/            # else extract first column
h                           # hold
s/.*/echo output &/e        # exeute external command echo with first column as argument
G                           # append previous hold value
s/(.*)\n(.*)/\2,\1/         # arrange position
p' file                     # print result

관련 정보