如何操作awk输出?

时间:2012-02-12 22:06:44

标签: linux bash awk

如果我输入

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"

应该怎么做?

5 个答案:

答案 0 :(得分:3)

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调用将它们作为格式字符串的一部分放回......

答案 1 :(得分:2)

这会奏效。使用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(“auto-da-fe”,a,“ - ”)将字符串auto-da-fe' into three fields using - '拆分为分隔符。

     

它设置数组a的内容   如下:a [1] =“auto”a [2] =“da”a [3] =“fe”

答案 2 :(得分:2)

您可以尝试使用gsub功能:

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

它可以匹配多个条件。这可能是最短的解决方案。

答案 3 :(得分:2)

您可以将逗号和双引号添加为字段分隔符并相应地适应

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"

答案 4 :(得分:1)

只需操纵$7即可删除您不想要的字符:

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