簡體   English   中英

如何操作awk輸出?

[英]How to manipulate awk output?

如果我輸入

echo '"";"";" 01.06.2011";"7";"01.06";"-21,00";"-6.097,73";' | awk -F';' '{print $3 " " $7}'

然后我明白了

" 01.06.2011" "-6.097,73"

但我想要的是

" 01.06.2011" "-6097"

應該怎么做?

AWK支持 printf函數,並且從內存中解析盡可能多的字符串作為整數。 所以,從你的例子來看:

awk -F';' '{printf("%s %i", $3, $7*1000);}'

會工作。 這也適用於任何大小的數字......

(由於數據中的雙引號,上面不起作用,見下文......)

編輯:如果你正在使用gawk,你可以使用printfstrtonum的組合穩定地實現這一點

awk -F';' '{ gsub(/"/, "", $7); printf("%s \\"%i\\"\\n", $3, strtonum($7)*1000); }'

gsub()調用剝離引號,以便strtonum不會阻塞它們,然后printf調用將它們作為格式字符串的一部分放回...

這會奏效。 使用split()

echo '"";"";" 01.06.2011";"7";"01.06";"-21,00";"-6.097,73";' | awk -F';' '{ split($7, a, ",") split(a[1], b, "."); print $3 " " b[1] b[2]"\""}'

split()sub()

awk -F';' '{ split($7, a, ",");b = a[1]; sub(/\./, "",a[1]);  print $3 " " a[1] "\""}'

或者只是使用sub()

awk -F';' '{ sub(/,.*/, "", $7); sub(/\./, "", $7) ;print $3 " " $7 "\""}'

相關文件:

split(string,array,fieldsep)

這將字符串分割為由fieldsep分隔的片段,並將片段存儲在數組中。 第一部分存儲在數組[1]中,第二部分存儲在數組[2]中,依此類推。 第三個參數fieldsep的字符串值是描述拆分字符串的位置的正則表達式(就像FS可以是描述拆分輸入記錄的位置的正則表達式一樣)。 如果省略fieldsep,則使用FS的值。 split返回創建的元素數。 然后,split函數以類似於輸入行分割為字段的方式將字符串拆分為多個片段。 例如:

split(“auto-da-fe”,a,“ - ”)將字符串auto-da-fe' into three fields using - '作為分隔符。

它將數組a的內容設置如下:a [1] =“auto”a [2] =“da”a [3] =“fe”

您可以嘗試使用gsub函數:

echo '"";"";" 01.06.2011";"7";"01.06";"-21,00";"-6.097,73";' | awk -F';' '{gsub(/(,.*|\.)/,"",$7);print $3" "$7"\"";}'

它可以匹配多個標准。 這可能是最短的解決方案。

您可以添加逗號和雙引號作為字段分隔符並相應地適應

awk -F'[";,]' '{print "\""$8 " \""$21*1000"\""}'

產量

$ awk -F'[";,]' '{print "\""$8 " \""$21*1000"\""}' <<<'"";"";" 01.06.2011";"7";"01.06";"-21,00";"-6.097>
" 01.06.2011 "-6097"

只需操作$7即可刪除不需要的字符:

awk -F';' '{
  gsub(/[.]/, "", $7)
  sub(/,[0-9]*/, "", $7)
  print $3, $7
}'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM