Linux 如何操作awk输出?

Linux 如何操作awk输出?,linux,bash,awk,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" 该怎么做呢?这样就行了。使用 或者是split()和sub()的组合 或者只使用sub() 相关文件: 拆分(字符串、数组、字段sep) 这把绳子分成几段 由fieldsep

如果我打字

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"
该怎么做呢?

这样就行了。使用

或者是
split()
sub()
的组合

或者只使用
sub()

相关文件:

拆分(字符串、数组、字段sep)

这把绳子分成几段 由fieldsep分隔,并将碎片存储在阵列中。第一件 存储在数组[1]中,第二块存储在数组[2]中,依此类推。这个 第三个参数fieldsep的字符串值是描述 where-to-split字符串(就像FS可以是描述到何处的regexp一样) 拆分输入记录)。如果省略字段sep,则FS的值为 用过。split返回创建的元素数。分裂 然后,函数以类似于 将输入行拆分为字段的方式。例如:

split(“auto-da-fe”,a“-”)将字符串
auto-da-fe'拆分为三个
使用
-”作为分隔符的字段

它将数组的内容设置为a 如下所示:a[1]=“自动”a[2]=“da”a[3]=“fe”

AWK支持该函数,并且从内存中尽可能多地解析字符串作为整数。从你的例子来看:

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

会有用的。这也适用于任何尺寸的号码…

(由于数据中有双引号,以上不起作用,请参见下文…)

编辑:如果您使用的是gawk,则可以使用和的组合稳定地实现这一点

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


gsub()
调用去掉引号,以便
strtonum
不会阻塞引号,然后
printf
调用将引号作为格式字符串的一部分放回…

您可以尝试使用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”\”“}只需操纵
$7
即可删除不需要的字符:

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

非常接近。我给出了
“01.06.2011”“-6.097”
也应该删除。@SandraSchlichting已更正。可能有更好的方法,但这很有效。它输出
“01.06.2011”0
[。]
意思?我猜它删除了
,但是为什么需要方括号呢?正则表达式中的点是一个通配符,可以匹配任何单个字符。但是括号表达式中的点没有特殊意义:它只是一个点。另一种编写方法是使用转义:
gsub(/\./,“”,$7)
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"
awk -F';' '{
  gsub(/[.]/, "", $7)
  sub(/,[0-9]*/, "", $7)
  print $3, $7
}'