web-dev-qa-db-ja.com

ファイル内のパターンを一致させ、一致する単語(行全体ではない)を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
2
xrkr

必要な出力が常にファイルの最後のフィールドである場合は、これを試してください

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

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
Jeff Schaller

サンプルデータの最初の列には、行#2以降のエントリがないため、fixed-width列として解析する必要があります。あなたはこれを行うことができます:

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

これは、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 [〜#〜]-compatibleマナー、すべての行が少なくとも1つの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
Rakesh Sharma
awk 'NR==1 {print $2}' filename && awk 'NR>1' filename | sed 's/[[:space:]]*//g'

出力:

ASHM001002003VOL01
BSHM001002003VOL02
CSHM001002003VOL03
DSHM001002003VOL03_DUP
ESHM001002003VOL04
FSHM001002003VOL05
GSHM001002003VOL06_
HSHM001002003VOL07

これにより、最初の行の2番目の列、次の行が印刷され、空白が削除されて書式が修正され、必要な出力が返されます。

1
Nasir Riley

awk '{head = substr($ 0,1,16); mypat = substr($ 0,17,23); if(mypat〜/ SHM /)。 {print mypat}} 'ファイル名

0
kalpesh