grep -v:一致する項目の最初(または最後の)N行だけを除外する方法は?

grep -v:一致する項目の最初(または最後の)N行だけを除外する方法は?

時には、表形式データに非常に迷惑な行があることがあります。

column name | other column name
-------------------------------

私は一般的に存在してはならないジャンク行を削除するために合理的に一意の文字列を渡すことを好みますgrep -vが、このアプローチの問題は、合理的に一意の文字列が誤ってデータに表示される場合に深刻な問題であることです。

削除できる行数grep -v(例:1)を制限する方法はありますか?ボーナスポイントの場合を使用せずに最後から行数を計算する方法はありますか<some command> | tac | grep -v <some stuff> | tac

ベストアンサー1

awk最初のものを無視できますN一致する行(たとえば、ファイルから最初と2番目の項目のみを削除したい場合):

n=2
awk -v c=$n '/PATTERN/ && i++ < c {next};1' infile

最後のものは無視してくださいN一致する行:

awk -v c=${lasttoprint} '!(/PATTERN/ && NR > c)' infile

${lasttoprint}ファイル内の最後に一致するth + 1行番号はどこにありますか?nこの行番号を取得する方法はいくつかあります。 (たとえば、sed/ etcを使用して一致する各行番号を印刷してawk抽出tail | headします。)... 1つの方法は次のとおりですgnu awk

n=2
lasttoprint=$(gawk -v c=$((n+1)) '/PATTERN/{x[NR]};
END{asorti(x,z,"@ind_num_desc");{print z[c]}}' infile)

おすすめ記事