열이 부동 상태인지 확인

열이 부동 상태인지 확인

열이 부동인지 확인하고 싶은 요구 사항이 있습니다. 부동 소수점인 경우 다른 연결은 수행되지 않습니다 .00.

문서:

2017 47.0000 0.783333 0.2500
1663 1920.0000 32 8.0000

예상 출력:

2017 47.0000 0.783333 0.2500
1663 1920.0000 32.00 8.0000

주문하다:

awk -F" " '{if ($9=="^[0-9]") {print  $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$7$8} else {print  $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$7}}' | head -1

답변1

awk '$3 !~ /\./ { sub($3, $3 ".00") } { print }' columns

분명히 이 권장 사항은 샘플 입력을 기반으로 합니다. 이는 다음과 같이 작동합니다. 세 번째 열(OP의 코드는 9번째 열을 사용하지만 예제 입력은 그다지 길지 않음)에 리터럴 포인트가 포함되어 있지 않으면 세 번째 열을 세 번째 열과 리터럴 문자열 .00( 즉, 열에 문자열을 추가합니다. 그런 다음 일치 여부에 관계없이 줄을 인쇄하십시오. 이 명령은 1일부 사용자에 의해 축약되어 사용되지만 저는 이 명령이 너무 비밀스럽다고 생각합니다.

이 솔루션은 열 자체를 교체하는 대신 문자열 교체를 사용하므로 안전하지 않습니다.

답변2

첫 번째 열 이후의 모든 열에서 정수를 찾아 다음을 추가합니다 .00.

$ awk '{for (i=2;i<=NF;i++) if (!($i ~ /[.]/))$i=$i ".00"} 1' input
2017 47.0000 0.783333 0.2500
1663 1920.0000 32.00 8.0000

어떻게 작동하나요?

  • for (i=2;i<=NF;i++)

    i=2그러면 두 번째 필드에서 시작하여 마지막 필드로 이동하는 필드 루프가 시작됩니다 i=NF.

  • if ( !($i ~ /[.]/))$i=$i ".00"

    각 루프에 대해 i번째 필드 에 마침표가 포함되어 i있는지 확인합니다 . $i그렇다면 ($i ~ /[.]/)true로 평가됩니다. 그러나 우리는 이 결과를 부정합니다. 필드가 다음인 경우에만 !($i ~ /[.]/)true입니다.i아니요마침표가 포함되어 있습니다. 그렇다면 .00필드 끝에 추가합니다 i.

    if문은 루프의 유일한 문입니다 for.

  • 1

    이것은 awk의 전체 줄 인쇄에 대한 비밀스러운 약어입니다.

관련 정보