
3つのファイルがあり、各ファイルには何百万ものレコードがあります。いくつかのデータを見つけやすくするために、これらのファイルをフィルタリングしたいと思います。残念ながら、あるレコードから別のレコードにつながる普遍的な形式はありません。たとえば、
record1 will contain: A B C D E
record2 will contain A B D E
record3 will contain B C D
私が持っている唯一の共通部分は、いくつかの識別子を含む最初の23文字です(このうち最後の15文字のみがレコード間で一意です)。
識別子とD部分を含むようにこれらのファイルをフィルタリングしたいと思います。どうすればいいですか?フィールド間の区切り文字はタブであり、各部分にカンマがあることがわかります。
パートDの例:
ROAMENT,INT,15
ROAMENT - constant part which identifies the field
INT - some value which is a must if ROAMENT exists
15 - some other value which is optional
答え1
perl -ane 'if (/\t(ROAMENT[^\t\n]*)/) { print $F[0], $1, "\n"; }' inputfile
説明する:
-a
自動分割を呼び出して、入力フィールドを@ F配列に分割します。空白がある場合、フィールドは分割されます。タブだけが必要な場合は追加できます。-F"\t"
-n
最後に入力行を印刷する代わりに、入力データに対して自動ループを呼び出します。-e
各ループで実行する式の定義- この式は<tab>ROAMENTをチェックし、タブまたは改行文字の前に文字がある場合は、自動分割配列の最初のフィールドと見つかったフィールドを印刷します。