Сопоставить шаблон в файле и распечатать соответствующее слово (не всю строку) во втором столбце

Проблема заключается в \d, который не понимается sed regex, поэтому вы должны использовать класс символов цифр: [0-9]. Кроме того, скобки sed для этого использования требуют предшествующих обратных слешей. Вместо:

.*\/\d{10}\..*

попробуйте

.*\/[0-9]\{10\}\..*

Если вместо этого указать -regextype posix-egrep, то получится:

.*\/[0-9]{10}\..*

Существует множество различных версий регулярных выражений. Я бы посоветовал вам найти документацию по команде, которую вы используете, чтобы найти правильный синтаксис regex.

С сайта regxr.com:

RegExr использует механизм RegExp вашего браузера для подбора, а его подсветка синтаксиса и документация отражают стандарт JavaScript RegExp.

Что отчасти объясняет, почему regex не работает с find.

2
16.09.2018, 15:14
6 ответов

Если вы хотите вывести всегда последнее поле в файле, попробуйте следующее

awk '{if ($NF ~ /SHM/) {print $NF}}' _input_file_
4
27.01.2020, 21:49

Поскольку в первом столбце данных вашего примера нет записей, начинающихся со строки #2 и далее, вам придется анализировать его как столбцы fixed-width. Вы можете сделать это:

$awk 'BEGIN {FIELDWIDTHS = "16 40"} /SHM/ { print $2}'
ASHM001002003VOL01
BSHM001002003VOL02
CSHM001002003VOL03
DSHM001002003VOL03_DUP
ESHM001002003VOL04
FSHM001002003VOL05
GSHM001002003VOL06_
HSHM001002003VOL07
3
27.01.2020, 21:49

Если у вас есть GNU grep,

grep -Eo '[[:alnum:]_]*SHM[[:alnum:]_]*' < filename.txt

Если нет, вы можете попросить awk перебирать поля каждой строки в поисках SHM:

awk '{ for(i=1;i<=NF;i++) if ($i ~ /SHM/) print $i }' < filename.txt
5
27.01.2020, 21:49
awk 'NR==1 {print $2}' filename && awk 'NR>1' filename | sed 's/[[:space:]]*//g'

Выход:

ASHM001002003VOL01
BSHM001002003VOL02
CSHM001002003VOL03
DSHM001002003VOL03_DUP
ESHM001002003VOL04
FSHM001002003VOL05
GSHM001002003VOL06_
HSHM001002003VOL07

Это печатает второй столбец в первой строке, следующие строки, а затем удаляет пробелы, чтобы исправить форматирование и вернуть желаемый результат.

1
27.01.2020, 21:49

Вы можете сделать это следующим образом, используяPerl:

perl -lne 'print for /\w*SHM\w*/g' input-file.txt

perl -lane 'print for grep /SHM/, @F' input-file.txt # assuming SHM fields r alphanumeric

Или с помощью sedредактора, POSIX-совместимого способа, предполагая, что все строки имеют по крайней мере один SHM

sed -ne '
    s/[[:alnum:]_]*SHM[[:alnum:]_]*/\
&\
/;s/.*\n\(.*\n\)/\1/;P;/\n$/!D
' input.txt

Выход:

ASHM001002003VOL01
BSHM001002003VOL02
CSHM001002003VOL03
DSHM001002003VOL03_DUP
ESHM001002003VOL04
FSHM001002003VOL05
GSHM001002003VOL06_
2
27.01.2020, 21:49

awk '{head=substr ($0,1,16 );mypat=substr ($0,17,23 );if (mypat ~/SHM/ ). {print mypat}}' имя файла

0
27.01.2020, 21:49

Теги

Похожие вопросы