awk를 사용하여 파이프로 구분된 파일에서 선행 0을 제거합니다.

awk를 사용하여 파이프로 구분된 파일에서 선행 0을 제거합니다.

파이프 구분 기호에 소스 파일이 있고 선행 0을 제거해야 합니다.

초기 파일:

010N00000001|20100111|20150112|PA|3|00001|41|+0000000100.00|+0000000000.00|+0000000000.00|022|R| |
010N00000001|20100115|20150115|PA|3|00001|41|-0000000050.00|+0000000000.00|+0000000000.00|022|R| |

원하는 출력:

010N00000001|20100111|20150112|PA|3|1|41|100.00|0|0|022|R||
010N00000001|20100115|20150115|PA|3|1|41|-50.00|0|0|022|R||

awk누구든지 위의 구문을 제공 할 수 있습니까? 더 많은 속성이 있는데 6번째 및 8번째 소스 속성과 해당하는 6번째 및 8번째 출력 속성 값을 알고 싶습니다.

답변1

예를 들어 file데이터가 포함된 경우:

awk -F\| -v OFS=\| '{ $6  = sprintf( "%.0f",  $6  )
                      $8  = sprintf( "%.2f",  $8  )
                      $9  = sprintf( "%.0f",  $9  )
                      $10 = sprintf( "%.0f",  $10 )
                      print }' file

-F\|옵션은 (입력) 필드 구분 기호를 파이프 기호로 설정하며 -v OFS=\|출력 필드 구분 기호에도 동일하게 적용됩니다. 할당이 있는 줄은 - 함수를 사용하여 해당 필드의 형식을 다시 지정하고 ( 동일한 매개변수로 인쇄된 내용을 sprintf()반환함 ) 마지막으로 - 함수를 사용하여 형식이 완전히 변경된 레코드를 출력합니다 .printf()print

다시 포맷하는 경우 sprintf()여러 가지 중에서 선택할 수 있습니다.제어 문자그리고 관련수정자. 이 링크는 GNU awk 문서를 가리키지만 대부분의 문자는 매우 일반적입니다.

답변2

이 시도,

awk 'BEGIN{OFS=FS="|"}{$6=sprintf("%1.0f",$6);$8=sprintf("%3.2f",$8);$9=sprintf("%1.0f",$9);$10=sprintf("%1.0f",$10)}1;' tt.txt

010N00000001|20100111|20150112|PA|3|1|41|100.00|0|0|022|R| |
010N00000001|20100115|20150115|PA|3|1|41|-50.00|0|0|022|R| |
  • %X, 여기서 X는 필수 숫자입니다.
  • .xf, 여기서 x는 필수 소수점입니다.

원천

답변3

numfmtGNU의 GNU Coreutils 패키지는 이러한 작업에 유용합니다. 불행하게도 아직 multiple 사양을 허용하지 않는 것 같고 --field단항 --format숫자를 처리하지 않는 것 같습니다 +. 약간의 논란이 있습니다:

$ sed 's/[+ ]//g' file | 
    numfmt -d'|' --field=8 --format='%.2f' | numfmt -d'|' --field=6,9,10 --format='%.0f'
010N00000001|20100111|20150112|PA|3|1|41|100.00|0|0|022|R||
010N00000001|20100115|20150115|PA|3|1|41|-50.00|0|0|022|R||

답변4

다음 명령을 사용해 보았더니 예상한 대로 제대로 작동했습니다.

k=`awk '{print NF}' example.txt | sort -nr| sed -n '1p'`

for ((j=1;j<=2;j++)); do for((i=1;i<=$k;i++)); do awk -F "| -v i="$i" -v j="$j"  'NR==j{print $i}' example.txt| sed "s/^[+-]//g"| sed "s/^0\{2,\}//g"| sed "s/^\..*/0/g"; done| tr "\n" "|"| sed 's/|$//g'| sed 's/^|//g'; done| sed -r "s/\s+/|\n/g"| sed "s/^|//g"

산출

010N00000001|20100111|20150112|PA|3|1|41|100.00|0|0|022|R||
010N00000001|20100115|20150115|PA|3|1|41|50.00|0|0|022|R||

관련 정보