다음과 같은 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