匹配文件中的模式并在第二列中打印匹配的单词(不是整行)

匹配文件中的模式并在第二列中打印匹配的单词(不是整行)

我试图匹配包含以下信息的文件中的模式“SHM”,并打印与该模式匹配的单词。

LOCALZONE01     ASHM001002003VOL01
                BSHM001002003VOL02
                CSHM001002003VOL03
                DSHM001002003VOL03_DUP
                ESHM001002003VOL04
                FSHM001002003VOL05
                GSHM001002003VOL06_
                HSHM001002003VOL07

我尝试使用 awk 打印第二列:

grep "SHM" <filename.txt> | awk -F" " '{print $2}'

ASHM001002003VOL01

如果我尝试打印第 1 列,它会给出以下输出:

LOCALZONE01
BSHM001002003VOL02
CSHM001002003VOL03
DSHM001002003VOL03_DUP
ESHM001002003VOL04
FSHM001002003VOL05
GSHM001002003VOL06_
HSHM001002003VOL07

以下是我想要的输出。我怎么才能得到它?

ASHM001002003VOL01
BSHM001002003VOL02
CSHM001002003VOL03
DSHM001002003VOL03_DUP
ESHM001002003VOL04
FSHM001002003VOL05
GSHM001002003VOL06_
HSHM001002003VOL07

答案1

如果你有 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

答案2

如果您想要的输出始终是文件中的最后一个字段,请尝试此操作

awk '{if ($NF ~ /SHM/) {print $NF}}' _input_file_

答案3

由于示例数据的第一列没有从第 2 行开始及以后的条目,因此您必须将其解析为fixed-width列。你可以这样做:

$awk 'BEGIN {FIELDWIDTHS = "16 40"} /SHM/ { print $2}'
ASHM001002003VOL01
BSHM001002003VOL02
CSHM001002003VOL03
DSHM001002003VOL03_DUP
ESHM001002003VOL04
FSHM001002003VOL05
GSHM001002003VOL06_
HSHM001002003VOL07

答案4

awk 'NR==1 {print $2}' filename && awk 'NR>1' filename | sed 's/[[:space:]]*//g'

输出:

ASHM001002003VOL01
BSHM001002003VOL02
CSHM001002003VOL03
DSHM001002003VOL03_DUP
ESHM001002003VOL04
FSHM001002003VOL05
GSHM001002003VOL06_
HSHM001002003VOL07

这将打印第一行的第二列、以下几行,然后删除空格以修复格式并返回所需的输出。

相关内容