У меня большой файл, в котором есть такие блоки:

....
Org Id VIN                  Plate Registration   Error Code
------ -------------------- -------------------- ------------------------------------------
124    aaaaaaaaaaaaaaaaa    WI-V-456             Info 1
124    bbbbbbbbbbbbbbbbb    DH-BE-1111           Info 2
124    ccccccccccccccccc    A-RM-1332            Info 3
124    ddddddddddddddddd    S-SH-3333            Info 4
124    eeeeeeeeeeeeeeeee    RH-L-360             Info 5

---------------------------------------------------------------------------------------------
....

Я просто хочу извлечь столбец Error Code каждого из них, как я могу это сделать?

cat ${fichier} | while read line
   do
   if [ "x${line}" = 'xOrg Id VIN                  Plate Registration   Error Code' ]
        then 
            echo  ${line}
                        ##
        fi
   done
0
ZHE.ZHAO 22 Май 2014 в 12:12
Все ли нужные строки имеют формат Info XXX?
 – 
fedorqui
22 Май 2014 в 12:52
Если формат значений в столбце Error Code отличается (например, это всегда будет «Информация 1» и/или «Предупреждение 4» и/или «Ошибка 255»), вы также можете использовать sed чтобы выделить: sed -r 's/(<APPROPRIATE REGEX HERE>)$/\1/g'
 – 
try-catch-finally
22 Май 2014 в 12:54

2 ответа

Лучший ответ

Например, вы можете использовать awk:

$ awk '$NF>0{print $(NF-1), $NF}' file
Error Code
Info 1
Info 2
Info 3
Info 4
Info 5

Это напечатает предпоследнее и последнее поля, если последнее представляет собой текст или числа.

1
fedorqui 22 Май 2014 в 12:14
Это надежно только в том случае, если в столбцах всегда есть значения без пробелов и если количество столбцов не изменяется. (Awk по умолчанию разбивает поля (столбцы) на пробельные символы.)
 – 
try-catch-finally
22 Май 2014 в 12:51
Да, вы правы, я разместил ответ на основе текущего образца ввода/желаемого вывода. Если окажется иначе, я отредактирую соответственно. Уже попросил ОП посмотреть, так это или нет.
 – 
fedorqui
22 Май 2014 в 12:55
1
Спасибо большое за вашу помощь!
 – 
ZHE.ZHAO
23 Май 2014 в 14:06

У вас есть несколько вариантов. @fedorqui показал, что один из них использует awk, вы также можете использовать смешивание cut с grep:

$ cut -c 50- testfile.txt | grep ^[^-]
Error Code
Info 1
Info 2
Info 3
Info 4
Info 5

Что означает: вырезать тестовый файл txt - показать символы от 50 до конца строки ({{X 0}}), а затем отправить его в grep, чтобы отобразить только строки, которые не начинаются с символа "-".

0
Gabriel M 22 Май 2014 в 12:44
Большое спасибо! Это действительно полезно!
 – 
ZHE.ZHAO
23 Май 2014 в 14:05