假设我的原始文件如下所示:
N O D E O U T P U T
THE FOLLOWING TABLE IS PRINTED FOR NODES BELONGING TO NODE SET NSET_OUTPUT
NODE FOOT- NT11
NOTE
3 20.00
11 20.00
1003 23.75
1011 23.75
2003 27.52
2011 27.52
3003 31.30
3011 31.30
4003 35.08
我需要生成第二个文件,但只需将第二列上的值乘以 100。我怎样才能得到这个文件?
答案1
假设您想保留数字数据块的字段宽度和格式,我建议类似
awk '
$1 ~ /[0-9]+/ && $2 ~ /[-+0-9.]+/ {
$0 = sprintf("%6d%12.2f", $1, 100*$2)
} 1
' file
前任。
$ awk '$1 ~ /[0-9]+/ && $2 ~ /[-+0-9.]+/ {$0 = sprintf("%6d%12.2f", $1, 100*$2)} 1' file
N O D E O U T P U T
THE FOLLOWING TABLE IS PRINTED FOR NODES BELONGING TO NODE SET NSET_OUTPUT
NODE FOOT- NT11
NOTE
3 2000.00
11 2000.00
1003 2375.00
1011 2375.00
2003 2752.00
2011 2752.00
3003 3130.00
3011 3130.00
4003 3508.00
答案2
我选择将请求解释为生成仅由第二列中的数字乘以 100 组成的输出。
这假设标头是静态的并且始终为六行长。它将被忽略。
$ awk 'FNR > 6 { print 100*$2 }' <infile
2000
2000
2375
2375
2752
2752
3130
3130
3508
FNR > 6
当至少读取六行时,该条件将触发相乘并输出第二个字段的块。
如果您不知道标头有多长,您可以FNR > 6
使用$2 ~ /^-?[0-9.]+$/
which is a幼稚的测试第二个字段是否是浮点数的方法,可以选择带符号(“可选-
后仅跟数字和点”)。
答案3
假设您的输出保存在名为“outfile”的文件中,这是另一个解决方案 - 尽管警告是它不会保留带有数字数据的列的格式。
awk '{if(/^ *[0-9\.]+ *[0-9\.]+ *$/) {var=$2*100; print $1,var;} else { print $0 }}' outfile