awk를 사용하여 줄 끝에 문자열을 인쇄하는 방법은 무엇입니까?

awk를 사용하여 줄 끝에 문자열을 인쇄하는 방법은 무엇입니까?

나는 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

필드 번호 에 대해 awkwith 의 필드 에 직접 할당할 수 있습니다 . 새 필드는 끝에 다음 값으로 추가됩니다 .$NN$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

관련 정보