ファイルがありますA.tsv
(フィールド区切り記号= \t
)。
for Research Use Only
[Header]
Test Name Il
Run ID 2102
Run Date 2021-02-04
Report Date/Time 2021-02-05 08:48
Instrument Serial
Flow Cell ID
Software Version
[Quality Control]
Lane 1,2,3,4 PASS
Lane 1,2,3,4 Index Set 1 PASS
[Patient Sample Results]
Sample ID Internal Control Result Consensus Sequence Lane Index Set Index ID
207 Pass Not Available 1,2,3,4 1 UDP0001
205 Pass Not Available 1,2,3,4 1 UDP0002
[Control Sample Results]
Sample ID Control Type Human Control SARS-CoV-2 Lane Index Set Index ID
CONTROL-POS Positive Control Not Detected Detected 1,2,3,4 1 UDP0008
新しいファイルに次の行を印刷したいと思います。
Sample ID Internal Control Result Consensus Sequence Lane Index Set Index ID
207 Pass Not Available 1,2,3,4 1 UDP0001
205 Pass Not Available 1,2,3,4 1 UDP0002
CONTROL-POS Positive Control Not Detected Detected 1,2,3,4 1 UDP0008
[Patient Sample Results]
だから、後ろの行を印刷したいのですが、[Control Sample Results]
ヘッダー行は一度だけ印刷したいと思います。
ファイルはサブサンプリングされ、行番号でハードコーディングすることはできません。
だから私は次のことを試しました。
awk '/Patient Sample Results/{getline; print}' A.tsv > data_info.tsv
ただし、最初のパターン以降の行だけを印刷します。私の問題に対する解決策はありますか?
ベストアンサー1
セクション[ ... ]
この空行スペース/タブを含めることはできません。)、およびで始まるすべてのセクションの内容を印刷するには、[Patient Sample Results]
次の作業が必要です。
awk -F"\n" -v RS="" '$1~/^\[Patient Sample Results\]/{s=2}
s{for (i=s;i<=NF;i++) print $i; s=3}' A.tsv > data_info.tsv
これは「段落モード」で動作するように指示し、awk
空行グループをレコード区切り文字として扱い、改行をフィールド区切り文字として扱います。
$1
これで、「章タイトル」がレコードの最初の「フィールド」()として表示されます。最初のフィールド(=行)またはレコードがで始まる場合、これを示すフラグを
[Patient Sample Results]
設定します。s
2
- これから結果を印刷したいです。
- (最初は)印刷したい2行目(=フィールド)から始める初めて「タイトル」行を印刷したいからです。
注可能な末尾のスペース/タブを防ぐために、
$1 ~
文字列比較全体の代わりに正規表現比較を使用しています。$1==
設定されている場合は、
s
numberで始まるフィールド(=line)を印刷しますs
(最初は2です)。次に、後で「ヘッダー」行をスキップできるように3に設定します。
フィールド(=行)は「現状のまま」印刷されるため、入力ファイル内の区切り文字は保持されます。
セクションが実際にスペースを含む「空白」行で区切られている場合、複数文字レコード区切り文字にGNUを要求する次の修正を使用すると、awk
これは発生しません(参照:StackOverflowに対する@EdMortonの返信例えば):
awk -F'\n' -v RS='\n(([[:space:]]*\n)+|$)' ' ... '
これは、「完全に空白または空白文字のみを含む」数値をレコード区切り文字として扱います。