나는 awk를 처음 접했습니다. 새로운 계산된 열을 추가하려고 합니다. 그러나 awk는 현재 행의 끝이 아닌 다음 행에 열을 삽입합니다.
내 데이터의 예는 다음과 같습니다.
,2013-11-22,12.9,26.0,26.6,,,NW
내가 원하는 것은 다섯 번째 열($5 > 0인 경우 yes, 그렇지 않은 경우 no)을 기준으로 "yes" 또는 "no"를 포함하는 열을 끝에 추가하는 것입니다.
이것은 내 awk 명령입니다.
awk -F, '{
if($5 > 0) print $0, ",YES"; else print $0, ",NO"
}' data.csv
결과는 다음과 같습니다.
,2013-11-22,12.9,26.0,26.6,,,NW
YES
이 문제를 어떻게 해결할 수 있나요?
답변1
필드 번호 에 대해 awk
with 의 필드 에 직접 할당할 수 있습니다 . 새 필드는 끝에 다음 값으로 추가됩니다 .$N
N
$9 = "YES"
"YES"
awk -F, -v OFS=, '{ if ($5 > 5) { $9 = "YES" } else {$9 = "NO"} };1' data
에 할당하면 $9
이 데이터 끝을 넘어서는 필드인 9번째 필드가 생성됩니다. 1
끝에 배치하면 awk
기본 출력이 발생하며 그렇지 않으면 억제됩니다.
귀하의 예를 들어, 위의 내용은 다음과 같습니다.
,2013-11-22,12.9,26.0,26.6,,,NW,YES
나는 이것이 당신이 원하는 것이라고 생각합니다.
마지막 필드가 되도록 하려면 처음에 필드 수에 관계없이 필드 수를 사용하여 NF
이를 초과하는지 확인할 수 있습니다.
awk -v OFS=, -F, '{ if ($5 > 5) {$(NF+1)="YES"} else {$(NF+1)="NO"} };1' data
$
모든 숫자 표현식을 허용하므로 1을 추가하여 NF
사용 가능한 다음 필드에 액세스할 수 있습니다.
답변2
더 짧은 awk
솔루션:
$ awk -F',' '$(NF+1) = $5 > 0 ? "YES" : "NO"' OFS=',' file
파일에 windows
개행 문자가 포함되어 있으면 이를 제거할 수 있습니다.
$ awk -F',' '{sub(/\r$/,"")} $(NF+1) = $5 > 0 ? "YES" : "NO"' OFS=',' file