Linux 如何从标准输出中grep指定列中的所有数据?
现在我有了一个标准输出,它由我的程序打印并显示在屏幕上。输出如以下部分所示:Linux 如何从标准输出中grep指定列中的所有数据?,linux,grep,Linux,Grep,现在我有了一个标准输出,它由我的程序打印并显示在屏幕上。输出如以下部分所示: Parsing command line string 'InputFile = foreman.qcif'. Parsing command line string 'NumberReferenceFrames = 1'. Parsing command line string 'QPISlice = 24'. Parsing command line string 'QPPSlice = 24'. -------
Parsing command line string 'InputFile = foreman.qcif'.
Parsing command line string 'NumberReferenceFrames = 1'.
Parsing command line string 'QPISlice = 24'.
Parsing command line string 'QPPSlice = 24'.
------------------------------- JM 11.0 (FRExt) --------------------------------
Input YUV file : foreman.qcif
Output H.264 bitstream : test.264
Output YUV file : test_rec.yuv
YUV Format : YUV 4:2:0
Frames to be encoded I-P/B : 150/0
PicInterlace / MbInterlace : 0/0
Transform8x8Mode : 1
-------------------------------------------------------------------------------
Frame Bit/pic QP SnrY SnrU SnrV Time(ms) MET(ms) Frm/Fld Ref
-------------------------------------------------------------------------------
0000(NVB) 168
0000(IDR) 34280 24 39.724 41.720 43.998 286 0 FRM 1
0002(P) 7432 24 38.857 41.565 43.829 402 99 FRM 1
0004(P) 8976 24 38.642 41.275 43.698 409 97 FRM 1
0006(P) 8344 24 38.427 41.266 43.515 407 99 FRM 1
0008(P) 8224 24 38.609 41.082 43.524 413 94 FRM 1
0010(P) 7784 24 38.655 40.991 43.235 406 95 FRM 1
0012(P) 7136 24 38.534 40.687 43.273 411 95 FRM 1
0014(P) 6688 24 38.464 40.756 43.146 410 92 FRM 1
0016(P) 7720 24 38.516 40.585 42.851 410 91 FRM 1
0018(P) 6864 24 38.474 40.631 42.958 411 101 FRM 1
0020(P) 8392 24 38.433 40.607 42.646 415 99 FRM 1
0022(P) 9744 24 38.371 40.554 42.498 416 94 FRM 1
0024(P) 8368 24 38.362 40.531 42.380 417 93 FRM 1
0026(P) 7904 24 38.414 40.586 42.415 418 95 FRM 1
0028(P) 8688 24 38.403 40.523 42.366 418 96 FRM 1
0030(P) 9128 24 38.545 40.390 42.661 416 89 FRM 1
0032(P) 9664 24 38.399 40.538 42.740 413 88 FRM 1
0034(P) 8928 24 38.394 40.590 42.852 414 95 FRM 1
0036(P) 10024 24 38.423 40.562 42.697 415 92 FRM 1
0038(P) 9320 24 38.442 40.389 42.689 414 94 FRM 1
0040(P) 7304 24 38.404 40.487 42.884 410 90 FRM 1
0042(P) 8560 24 38.447 40.590 42.673 411 95 FRM 1
现在我只需要处理SnrY的第四列
所以,我的问题是如何grep这个rol并将它们存储在data.txt文件中
然后,我可以使用绘图工具或Matlab用这些数据绘制数据趋势
有什么建议吗?非常感谢你的帮助
补充:
因为它需要从标准输出中选取这些数据,所以我是否需要使用您在命令行中提供的add命令,使其在输出这些数据时工作
?
注意:我只是猜测有趣的行包含FRM。如果不是这样,你必须想出一种不同的方法来识别它们
注意:我只是猜测有趣的行包含FRM。如果不是这样,您必须想出一种不同的方法来识别它们。这将匹配第四列中的数字,如38.4*:
grep-E'^[^]+[]+{3}38.4'这将匹配第四列中的数字,如38.4*: grep-E'^[^]+[]+{3}38.4' awk声明的快速分解: /^[0-9]/:匹配以数字开头的行 {print$4}:打印出第四列 更新:为了解决这个问题,因为它需要从标准输出中选择这些数据,我是否需要使用您在命令行中提供的add命令,以使它在输出这些数据时工作 您可以使用答案中给出的命令,方法是使用pipe |命令将程序的标准输出管道化。然后可以使用>,将结果存储到data.txt中 见上面的例子。类似的技术可用于本页中的其他解决方案 awk声明的快速分解: /^[0-9]/:匹配以数字开头的行 {print$4}:打印出第四列 更新:为了解决这个问题,因为它需要从标准输出中选择这些数据,我是否需要使用您在命令行中提供的add命令,以使它在输出这些数据时工作 您可以使用答案中给出的命令,方法是使用pipe |命令将程序的标准输出管道化。然后可以使用>,将结果存储到data.txt中 见上面的例子。类似技术可用于本页中的其他解决方案。tail-n+17 in.txt | cut-c 23-31tail-n+17 in.txt | cut-c 23-31 我期待着你想要得到的数据 不必在第16行之后,可以在第17行或第18行之后,等等 或者FRM/Fld字段可能有不同的指示器, 或者,第四个字段可能不是每次都在准确的字符位置。 所以上面只说:将记录分隔符设置为带破折号的行-,这样最后一条记录就是您需要的全部数据。然后使用换行符作为字段分隔符FS=\n,每个字段将是每行数据。用空格将它们分开,得到被分割线的元素4。那将是你想要的专栏 我期待着你想要得到的数据 不必在第16行之后,可以在第17行或第18行之后,等等 或者FRM/Fld字段可能有不同的指示器, 或者,第四个字段可能不是每次都在准确的字符位置。
所以上面只说:将记录分隔符设置为带破折号的行-,这样最后一条记录就是您需要的全部数据。然后使用换行符作为字段分隔符FS=\n,每个字段将是每行数据。用空格将它们分开,得到被分割线的元素4。这将是您需要的列。0000IDR 34280 24 39.724.0000IDR 34280 24 39.724。实际上,在我的处理过程中只需要SnrY列。因此,我真的想知道如何从这个输出中只选择一列数据。:thanksprint$4选择列。更有趣的问题是如何选择有趣的行。迈蒂亚诺,你误解了卢茨。他使用FRM仅选择数据行,即不选择标题。打印$4用于选择您想要的列。您为什么不使用我的答案中的正则表达式,而不是/FRM/,它将从第四列中选择数据。这个:/^[^]+[[]+{3}38.4/投票,很好地避免正则表达式和聪明的思维,我喜欢。实际上,在我的处理过程中只需要SnrY列。因此,我真的想知道如何从这个输出中只选择一列数据。:thanksprint$4选择列。更有趣的问题是如何选择有趣的行。迈蒂亚诺,你误解了卢茨。他使用FRM仅选择数据行,即不选择标题。打印$4用于选择您想要的列。为什么您不使用我的答案中的正则表达式,而不是/FRM/它将从第四列中选择数据。这个:/^[^]+[[]+{3}38.4/投票,很好地避免正则表达式和聪明的思维,我喜欢。最佳解决方案,+1。你可能想在那里抛出一个尾巴-n+16,从第16行左右开始,从而去掉头球。问题,这怎么可能是最好的解决方案?它是
假设标头始终处于设置的大小。不是说这是错的,我只是问。最好的解决方案,+1。你可能想在那里抛出一个尾巴-n+16,从第16行左右开始,从而去掉头球。问题,这怎么可能是最好的解决方案?它假定头文件始终处于设置的大小。我不是说这是错的,我只是问。
$ awk '/FRM/ { print $4 }' < in.txt > data.txt
./cmd_that_generates_results | awk '/^[0-9]/{print $4}' > data.txt
$ ./command | awk 'BEGIN{RS="--+";FS="\n"} END{ for(i=1;i<=NF;i++){if($i ~ /^[0-9]/){m=split($i,a," ");if(a[4]) print a[4]}}}'
39.724
38.857
38.642
38.427
38.609
38.655
38.534
38.464
38.516
38.474
38.433
38.371
38.362
38.414
38.403
38.545
38.399
38.394
38.423
38.442
38.404
38.447