ファイルのパターンを一致させ、2番目の列(完全な行ではない)に一致する単語を印刷します。

ファイルのパターンを一致させ、2番目の列(完全な行ではない)に一致する単語を印刷します。

次の情報を含むファイルで「SHM」パターンを一致させ、パターンに一致する単語を印刷しようとしています。

LOCALZONE01     ASHM001002003VOL01
                BSHM001002003VOL02
                CSHM001002003VOL03
                DSHM001002003VOL03_DUP
                ESHM001002003VOL04
                FSHM001002003VOL05
                GSHM001002003VOL06_
                HSHM001002003VOL07

awkを使用して2番目の列を印刷しようとしています。

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

そうでない場合は、各行のフィールドを繰り返してSHMを見つけるようにawkに要求できます。

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

その後、最初の行の2番目の列である次の行が印刷され、空白が削除され、書式が変更され、目的の出力が返されます。

関連情報