私はそれから数値リスト(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
したがって、「値」は)のダミー値にすぎません。NR
2番目のファイル(現在はより大きい)に達したら、最初の列()に次のものが含まれていることを確認FNR
してください。$1
配列インデックスによる存在するsearchstr
。その場合は、行全体を印刷します。
これに対するアイデアは、awk
配列インデックスリスト内にある場合は真である便利な構文を持つことです。string in array
string
array
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