最初の列からのみファイルの文字列のリストを抽出します。

最初の列からのみファイルの文字列のリストを抽出します。

私はそれから数値リスト(string.txt)を抽出したいと思いますmasterFile.list。複数の列masterFile.listに分けられ、|複数の列が含まれます。私は最初の列にfileの一致する数字を含む行だけに興味がありますstring.txt

文字列.txt:

3075
3078
3076

マスターファイル。リスト

3078    |       Auxenochlorella pyrenoidosa (H.Chick) Molinari & Calvo-Perez, 2015      |                   |       authority       |
3079    |       Auxenochlorella pyrenoidosa 3078    |               |       scientific name |
3076    |       Chlorella pyrenoidosa H.Chick, 1903     |               |       authority       |
3077    |       Chlorella vulgaris var. viridis Chodat, 1913    |               |       authority
487     |       ATCC 13077      |       ATCC 13077 <type strain>        |       type material   |
460     |       DSM 23076       |       DSM 23076 <type strain> |       type material   |

予想出力:

3078    |       Auxenochlorella pyrenoidosa (H.Chick) Molinari & Calvo-Perez, 2015      |                       |       authority       |
3076    |       Chlorella pyrenoidosa H.Chick, 1903     |               |       authority       |

私が見つけた以前の投稿のほとんどは、単一の文字列抽出のみを許可し、一致を最初の列に制限します。複数の文字列を一度に抽出できますか?

答え1

次のプログラムを使用できますawk

awk -F' *|' 'NR==FNR{searchstr[$1]=1} NR>FNR && ($1 in searchstr) {print}' string.txt masterFile.list

ご覧のとおり、これら2つのファイルをawk

  • 最初のファイル(グローバル行FNRカウンターと同じファイル別の行カウンターで表されますNR)を処理するとき、すべての検索文字列(唯一の項目なので、1行当たりのフィールド番号1)を1つの配列searchstr(しかし配列インデックス1したがって、「値」は)のダミー値にすぎません。

  • NR2番目のファイル(現在はより大きい)に達したら、最初の列()に次のものが含まれていることを確認FNRしてください。$1配列インデックスによる存在するsearchstr。その場合は、行全体を印刷します。

これに対するアイデアは、awk配列インデックスリスト内にある場合は真である便利な構文を持つことです。string in arraystringarray

Ed Mortonが指摘したように、「ゴルフ」をすることができます。

awk -F' *|' 'NR==FNR{searchstr[$1]; next} $1 in searchstr' string.txt masterFile.list

このsearchstr[$1]呼び出しは配列項目を定義しますが、入力しません。$1 in searchstr 外部ルールブロックの-if評価対象true-ディレクティブはawk現在の行を出力します。next処理ルールのディレクティブは、string.txtその部分にのみ到達することを保証します。masterFile.list

「最初のフィールド」が実際に数値であることを確認するために、フィールド区切り文字として完全正規表現(*|つまりスペースの後ろ)を指定しました。これを指定すると、末尾のスペースも含まれ、マッチングが行われます。プロセスがより複雑になりました。 「スペース」に実際にタブ文字を含めることができる場合は、代わりにそれを使用してください。|masterFile.list-F'|'-F'[[:space:]]*|'

答え2

他の人が指摘したように、いくつかのオプションがあります。

for i in $(cat string.txt); do grep -E "(^$i)" masterFile.txt; done

答え3

これはあなたに役立ちます

cat string.txt| while read -r str; do egrep "^$str *\|" masterFile.list;done

関連情報