如果我输入
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"
应该怎么做?
答案 0 :(得分:3)
AWK支持printf函数,并且从内存中解析尽可能多的字符串作为整数。所以,从你的例子:
awk -F';' '{printf("%s %i", $3, $7*1000);}'
会起作用。这也适用于任何大小的数字......
击>
(由于数据中的双引号,上面不起作用,见下文......)
编辑:如果您正在使用gawk,则可以使用printf和strtonum的组合稳定地实现此目标。
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
}'