我的输出格式不是很好,导致捕获变量值时出现问题。
例如:
This is counter1 1000
this counter2 2000
this counter3 is higher value 3000
现在从上面的文件我想要捕获1000,2000和3000.如果我使用awk与print $ x,其中x =任何值,那么它为每一行分配不同的值。 如果我使用$ 4然后第一行我将能够选择1000但是对于第二行它将不提供任何值,而对于第三行它将打印更高,因此我想插入字段分隔符并读取变量。非常感谢任何帮助!
答案 0 :(得分:5)
如果号码始终是最后一个字段,则可以
{ print $NF }
答案 1 :(得分:1)
如果您只想要最后一个参数,并且只有数字:
echo $'For example:\nThis is counter1 1000\nthis counter2 2000\n
this counter3 is higher value 3000\ndone.\n' |
sed -ne 's/^.* \([0-9]\{1,99\}\)/\1/p'
1000
2000
3000
您甚至可以捕获计数器的编号(因此只读包含counterX
的行):
echo $'For example:\nThis is counter1 1000\nthis counter2 2000\n
this counter3 is higher value 3000\ndone.\n' |
sed -ne 's/^.*\(counter[0-9]\{1,99\}\) \(.* \)\{0,1\}\([0-9]\{1,99\}\)$/\1 \3/p'
counter1 1000
counter2 2000
counter3 3000
甚至只是找到分隔符:
echo $'For example:\nThis is counter1 1000\nthis counter2 2000\n
this counter3 is higher value 3000\ndone.\n' |
sed -ne 's/^\(.*counter[0-9]\{1,99\}.*\) \([0-9]\{1,99\}\)$/\1 :: \2/p'
This is counter1 :: 1000
this counter2 :: 2000
this counter3 is higher value :: 3000
或,或......
echo $'For example:\nThis is counter1 1000\nthis counter2 2000\n
this counter3 is higher value 3000\ndone.\n' |
sed -e 's/^\(.*counter[0-9]\{1,99\}.*\) \([0-9]\{1,99\}\)$/\1 :: \2/'
For example:
This is counter1 :: 1000
this counter2 :: 2000
this counter3 is higher value :: 3000
done.
答案 2 :(得分:1)
要打印最后一个单词,请使用
awk '{ print $NF }'
要分隔数字,可以使用
cat yourfile | tr ' ' '\n' | egrep '^[0-9]+$'
或GNU特定grep -ow '[0-9]*' yourfile
要仅查找该行上的第一个单词,您可以使用
awk '{ for(i=0; i<=NF; i++) if($i ~ /^[0-9]+$/) { print $i; break; } }'
答案 3 :(得分:0)
要仅使用sed打印最后一个元素,请使用以下内容:
sed 's/.* //'
测试输入:
cat << EOF > infile
This is counter1 1000
this counter2 2000
this counter3 is higher value 3000
EOF
运行测试:
<infile sed 's/.* //'
输出:
1000
2000
3000
答案 4 :(得分:0)
使用sed的其他方式
sed -re 's/(.*)\s([0-9]+)/\2/' temp.txt
输出
1000
2000
3000
答案 5 :(得分:0)
正如其他建议你可以在awk中使用$ NF。 如果所有数字都是最后一个字段,你也可以使用perl:
perl -F -lane 'print $F[scalar(@F)-1]' your_file
或者如果它不总是最后一个字段,那么:
perl -F -lane 'for(@F){print if(/^\d+$/)}' your_file