1

我有一个格式不是很好的输出,这会导致捕获变量值的麻烦。

例如:

This is counter1 1000
this counter2 2000
this counter3 is higher value 3000

现在从上面的文件中,我只想捕获 1000、2000 和 3000。如果我将 awk 与 print $x 一起使用,其中 x = 任何值,那么它会为每一行分配不同的值。如果我使用 $4,那么对于第一行,我将能够选择 1000,但对于第二行,它不会提供任何值,对于第三行,它会打印得更高,所以我想插入字段分隔符并读取变量。任何帮助是极大的赞赏!

4

6 回答 6

5

如果数字始终是最后一个字段,您可以这样做

{ print $NF }
于 2013-01-29T22:41:16.563 回答
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.
于 2013-01-29T22:42:46.623 回答
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; } }'
于 2013-01-29T22:43:35.873 回答
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
于 2013-01-29T23:31:01.437 回答
0

使用 sed 的其他方式

sed -re 's/(.*)\s([0-9]+)/\2/' temp.txt

输出

1000
2000
3000
于 2013-01-30T00:59:18.107 回答
0

正如其他人建议的那样,您可以在 awk 中使用 $NF。如果所有数字始终是最后一个字段,您也可以使用 perl:

perl -F -lane 'print $F[scalar(@F)-1]' your_file

或者如果它并不总是最后一个字段,那么:

perl -F -lane 'for(@F){print if(/^\d+$/)}' your_file
于 2013-01-30T07:09:31.237 回答