Как получить все данные в указанном столбце из стандартного вывода? - PullRequest
1 голос
/ 18 января 2010

Теперь у меня есть стандартный вывод, который распечатывается моей программой и отображается на экране. Выходные данные выглядят следующим образом:

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

.......

Теперь мне нужно обработать только 4-й столбец SnrY.

Итак, мой вопрос: как выполнить поиск и сохранить их в файле data.txt?

Затем я могу использовать инструмент построения или Matlab для построения графиков трендов данных с этими данными.

Есть какие-нибудь советы? Большое спасибо за вашу помощь!

Дополнительно:

Поскольку ему нужно выбрать эти данные из стандартного вывода, нужно ли мне использовать (добавлять) команду, предоставленную вами в командной строке, чтобы она работала во время вывода этих данных ?

Ответы [ 5 ]

3 голосов
/ 18 января 2010

tail -n+17 in.txt | cut -c 23-31

3 голосов
/ 18 января 2010
$ awk '/FRM/ { print $4 }' < in.txt > data.txt

Примечание : Я просто предполагаю, что интересные строки содержат FRM.Если это не так, вы должны придумать другой способ их идентификации.

2 голосов
/ 18 января 2010
./cmd_that_generates_results | awk '/^[0-9]/{print $4}' > data.txt

Быстрая разбивка awk оператор:

  • / ^ [0-9] / : сопоставить строки, начинающиеся с цифры
  • {print $ 4} : распечатать четвертый столбец

(Обновлено) : для решения вопроса "Поскольку необходимо выбрать эти данные из стандартного вывода, нужно ли мне использовать (добавлять) команду, предоставленную вами в командной строке, для это работает во время вывода этих данных? "

Вы можете использовать команды, приведенные в ответах, передав им стандартный вывод вашей программы с помощью команды pipe (|). Затем результаты можно сохранить в «data.txt», используя > .

см. Пример выше. Подобные методы могут быть использованы для других решений на этой странице.

1 голос
/ 18 января 2010
$ ./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

Я ожидаю, что данные, которые вы хотите получить

  1. не обязательно после 16-й строки, может быть после 17-й или 18-й и т. Д.
  2. или поле FRM / Fld может иметь разные индикаторы,
  3. или 4-е поле не всегда может находиться в точной позиции символа.

Таким образом, вышеприведенное просто говорит: установите разделитель записей в виде строки с черточками «-», поэтому последняя запись - это все необходимые данные. затем, используя новую строку в качестве разделителя полей (FS = "\ n"), каждое поле будет каждой строкой данных. Разделите их пробелами и получите элемент 4 разделенной линии. это будет ваш желаемый столбец.

0 голосов
/ 18 января 2010

Это будет соответствовать числам вроде 38,4 * в четвертом столбце: grep -E '^([^ ]+[ ]+){3}38.4'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...