grep -vまたはsedを使用してファイルから1行を削除しようとしていますが、問題は削除後も結果の行数が変わりません。
$ grep $'\t59116613\t' ../chr/19.TB0002183.all.vcf
19 59116613 . T C 20.3144 . DP=42;VDB=0.566336;SGB=-0.651104;RPB=0.504878;MQB=0.0279668;MQSB=0.943468;BQB=0.362091;MQ0F=0;ICB=1;HOB=0.5;AC=1;AN=2;DP4=21,13,2
$ grep -v $'\t59116613\t' ../chr/19.TB0002183.all.vcf | wc -l
108067
$ wc -l ../chr/19.TB0002183.all.vcf
108067
答え1
行の計算が予期しない結果をもたらす場合は、各テキスト処理ユーティリティが同じ方法で行の意味を理解していることを確認する必要があります。これは通常、2つの質問に帰結します。
1)ファイル変換の問題:EOL(行末、改行、または改行文字とも呼ばれます)として使用される文字は何ですか?オペレーティングシステムに応じて\r
、\n
またはすることができます。\r\n
2)最後の行もEOLで終わりますか?そうでない場合、テキスト処理ユーティリティはそれをどのように処理しますか?
この場合、2番目の質問が説明につながります。
どのようなwc -l
?
マニュアルページから直接:
-l, --lines 改行数を印刷します。
明らかに、最後の行が改行で終わらない場合、最後の行は計算されません。つまり、結果は実際の行数より1少なくなります。
何が生産されますかgrep
?
grep
改行文字で各出力行を終了します。ドキュメントには見つかりませんでしたが、今テストしました。
これで、質問に記載されている動作を説明するためにテストを実行できます。
- 末尾の改行なしで3行を含むテストファイルを作成しましょう。
echo -ne "first\nsecond\nthird" > 3lines.txt
- 最後の文字を確認してみましょう。
tail -1 3lines.txt | od -c
まあ、「\n」はありません。
wc -l < 3lines.txt
出力は次のとおりです。 2(最後の改行文字が欠落しているため、最後の行は計算されません。)
- grepを介してすべての行を渡す
grep . < 3lines.txt | wc -l
出力は3です(改行文字は失われないので、すべての行が計算されます)。
- 1つの行のみをフィルタリングします(すべての行が可能です)。
grep -v first < 3lines.txt | wc -l
出力は2です(すべての行を再計算します)。