
수백만 개의 행과 열이 있는 파일(file1)이 있습니다. 데이터의 예는 다음과 같습니다.
"col1","col2","col3","col4","col5","col6"
"AAA",0,5,10,"BGB",50
"BBB",4,7,10,"BFD",76
"AAA",15,0,0,"BGB",20
"AAA",10,13,10,"DDD",23
col1에서 AAA가 있는 모든 행을 찾은 다음 col5에서 BGB가 있는 모든 행을 가져오고 싶습니다. 마지막으로 col2, col3, col4 및 col6의 모든 값을 50% 줄입니다(셀 값이 0이거나 비어 있으면 무시). 그리고 파일의 모든 줄을 인쇄하십시오. 따라서 내 출력은 다음과 같습니다.
"col1","col2","col3","col4","col5","col6"
"AAA",0,2.5,5,"BGB",25
"BBB",4,7,10,"BFD",76
"AAA",7.5,0,0,"BGB",10
"AAA",10,13,10,"DDD",23
다음을 시도했지만 작동시키지 못했습니다. (또한 gsub에서 여러 열을 사용하는 방법을 알 수 없었습니다.)
grep AAA file1 | awk -F "," '$5~/BGB/ {gsub($6,\substr($6,1,length($6)-1)*0.50\, $6}1'
답변1
awk는 grep과 같은 패턴과 일치할 수 있으므로 파이프라인에서는 grep 및 awk가 거의 필요하지 않습니다.
당신은 할 수
awk '
BEGIN {FS = OFS = ","}
$1 ~ /AAA/ && $5 ~ /BGB/ {
if ($2) $2 = $2 / 2
if ($3) $3 = $3 / 2
if ($4) $4 = $4 / 2
if ($6) $6 = $6 / 2
}
1
' file
또는 열을 보다 동적으로 줄이고 싶다면
awk -v "columns=2,3,4,6" '
BEGIN {
FS = OFS = ","
n = split(columns, a, /,/)
for (i=1; i<=n; i++) cols[a[i]]=1
}
$1 ~ /AAA/ && $5 ~ /BGB/ {
for (c in cols) if ($c) $c = $c / 2
}
1
' file