awkを使用して最後の列のスペースを識別する方法は?

awkを使用して最後の列のスペースを識別する方法は?

次のファイルがあります。最初の行はタイトルです。

"variant_id" "hg38_chr" "hg38_pos" "ref_allele" "alt_allele" "hg19_chr" "hg19_pos"
"chr10_100000235_C_T_b38" "chr10" "100000235" "C" "T" "chr10" 101759992
"chr10_100002628_A_C_b38" "chr10" "100002628" "A" "C" "chr10" 
"chr10_100004827_A_C_b38" "chr10" "100004827" "A" "C" "chr10" 101764584
"chr10_100005358_G_C_b38" "chr10" "100005358" "G" "C" "chr10" 101765115
"chr10_100005711_G_A_b38" "chr10" "100005711" "G" "A" "chr10" 101765468
"chr10_100006780_C_T_b38" "chr10" "100006780" "C" "T" "chr10" 101766537
"chr10_100007241_C_T_b38" "chr10" "100007241" "C" "T" "chr10" 101766998
"chr10_100008640_A_G_b38" "chr10" "100008640" "A" "G" "chr10" 
"chr10_100009013_G_A_b38" "chr10" "100009013" "G" "A" "chr10" 101768770

最後の列の空のフィールドを識別する方法は?次のコマンドを試しました。

awk '$7==" "' file.txt > blanks.txt
awk '{if($7==" ") print}' file.txt > blanks.txt

どちらも空のファイルを提供します。

Blanks.txtの結果は次のようになります。

"chr10_100002628_A_C_b38" "chr10" "100002628" "A" "C" "chr10" 
"chr10_100008640_A_G_b38" "chr10" "100008640" "A" "G" "chr10"

ベストアンサー1

この答えに対する最後の選択肢は、許可されているものについてより厳密であり、タブやスペースで区切られたフィールドとは無関係です。

しかし、まず:

最後のフィールドが空の場合、フィールドは6つだけです(スペースまたはタブで区切られた場合)。この行を印刷するには、次のようにします。

$ awk ' NF<7 {print}' infile

"chr10_100002628_A_C_b38" "chr10" "100002628" "A" "C" "chr10" 
"chr10_100008640_A_G_b38" "chr10" "100008640" "A" "G" "chr10"

{print}awkはデフォルトでtrueで、次の回避策から削除される式を印刷するため、このコマンドは実際には必要ありません。フェリックスJN)。

ヘッダーも必要な場合は、以下を追加してください。

$ awk '(NF<7) || (NR==1)' infile

"variant_id" "hg38_chr" "hg38_pos" "ref_allele" "alt_allele" "hg19_chr" "hg19_pos"
"chr10_100002628_A_C_b38" "chr10" "100002628" "A" "C" "chr10" 
"chr10_100008640_A_G_b38" "chr10" "100008640" "A" "G" "chr10"

十分なフィールドを含む行を維持するには、次の手順を実行します。

$ awk '(NF>=7) || (NR==1)' infile

"variant_id" "hg38_chr" "hg38_pos" "ref_allele" "alt_allele" "hg19_chr" "hg19_pos"
"chr10_100000235_C_T_b38" "chr10" "100000235" "C" "T" "chr10" 101759992
"chr10_100004827_A_C_b38" "chr10" "100004827" "A" "C" "chr10" 101764584
"chr10_100005358_G_C_b38" "chr10" "100005358" "G" "C" "chr10" 101765115
"chr10_100005711_G_A_b38" "chr10" "100005711" "G" "A" "chr10" 101765468
"chr10_100006780_C_T_b38" "chr10" "100006780" "C" "T" "chr10" 101766537
"chr10_100007241_C_T_b38" "chr10" "100007241" "C" "T" "chr10" 101766998
"chr10_100009013_G_A_b38" "chr10" "100009013" "G" "A" "chr10" 101768770

最後のファイルが欠落しているという事実に依存せず、代わりに行末に末尾の数字があることを確認する解決策が必要な場合は、次のようにします。

$ awk '/[0-9]+[ \t]*$/ || (NR==1)' infile

"variant_id" "hg38_chr" "hg38_pos" "ref_allele" "alt_allele" "hg19_chr" "hg19_pos"
"chr10_100000235_C_T_b38" "chr10" "100000235" "C" "T" "chr10" 101759992
"chr10_100004827_A_C_b38" "chr10" "100004827" "A" "C" "chr10" 101764584
"chr10_100005358_G_C_b38" "chr10" "100005358" "G" "C" "chr10" 101765115
"chr10_100005711_G_A_b38" "chr10" "100005711" "G" "A" "chr10" 101765468
"chr10_100006780_C_T_b38" "chr10" "100006780" "C" "T" "chr10" 101766537
"chr10_100007241_C_T_b38" "chr10" "100007241" "C" "T" "chr10" 101766998
"chr10 100009013_G_A_b38" "chr10" "100009013" "G" "A" "chr10" 101768770
"chr10 100009013 G_A_b38" "chr10" "100009013" "G" "A" "chr10" 101768770
"chr10_100009013_G_A_b38" "chr10" "100009013" "G" "A" "chr10" 101768770

これは、他のフィールドがなくても影響を受けず、使用されるフィールド区切り文字(スペースおよび/またはタブ)とは無関係です。

最後のフィールドが数字であると仮定いいえ二重引用符で囲まれていますが、必要に応じて簡単に変更できます。

そして、あなたの質問から要求された出力に厳密に準拠するには、次の手順を実行します。

$ awk '!/[0-9]+[ \t]*$/ && NR>1' infile
"chr10_100002628_A_C_b38" "chr10" "100002628" "A" "C" "chr10" 
"chr10_100008640_A_G_b38" "chr10" "100008640" "A" "G" "chr10"

おすすめ記事