以下のような情報を含むファイルでパターン「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
必要な出力が常にファイルの最後のフィールドである場合は、これを試してください
awk '{if ($NF ~ /SHM/) {print $NF}}' _input_file_
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以降のエントリがないため、fixed-width
列として解析する必要があります。あなたはこれを行うことができます:
$awk 'BEGIN {FIELDWIDTHS = "16 40"} /SHM/ { print $2}'
ASHM001002003VOL01
BSHM001002003VOL02
CSHM001002003VOL03
DSHM001002003VOL03_DUP
ESHM001002003VOL04
FSHM001002003VOL05
GSHM001002003VOL06_
HSHM001002003VOL07
これは、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_
awk 'NR==1 {print $2}' filename && awk 'NR>1' filename | sed 's/[[:space:]]*//g'
出力:
ASHM001002003VOL01
BSHM001002003VOL02
CSHM001002003VOL03
DSHM001002003VOL03_DUP
ESHM001002003VOL04
FSHM001002003VOL05
GSHM001002003VOL06_
HSHM001002003VOL07
これにより、最初の行の2番目の列、次の行が印刷され、空白が削除されて書式が修正され、必要な出力が返されます。
awk '{head = substr($ 0,1,16); mypat = substr($ 0,17,23); if(mypat〜/ SHM /)。 {print mypat}} 'ファイル名