このおもちゃの例に似たファイルがあります。私の実際のファイルには400万行があり、そのうち約10行を削除する必要があります。
ID Data1 Data2
1 100 100
2 100 200
3 200 100
ID Data1 Data2
4 100 100
ID Data1 Data2
5 200 200
最初の行を除いて、ヘッダーのように見える行を削除したいと思います。
最終文書:
ID Data1 Data2
1 100 100
2 100 200
3 200 100
4 100 100
5 200 200
どうすればいいですか?
答え1
あなたはそれを使用することができます
sed '2,${/ID/d;}'
行2からIDを持つ行が削除されます。
答え2
header=$(head -n 1 input)
(printf "%s\n" "$header";
grep -vFxe "$header" input
) > output
- 入力ファイルのヘッダー行を変数として取得します。
- タイトル印刷
grep
ヘッダーに一致する行を省略するようにファイルを処理します。- 上記の2つのステップの出力を出力ファイルとしてキャプチャします。
答え3
校正装置が好きではない人のために
sed -e '1n' -e '/^ID/d'
n
pass
行番号を示します。1
d
次に始まる一致するすべての行を削除します。^ID
答え4
これは興味深いものです。sed
を使用して、最初の行のすべてのコピーを削除し、他のすべての項目(最初の行自体を含む)を保持できます。
sed '1{h;n;};G;/^\(.*\)\n\1$/d;s/\n.*$//' input
1{h;n;}
sed
最初の行を予約済みスペースに入れて印刷し、次の行を読みます。最初の行の残りのコマンドはスキップされます。 (それも同じだ。1
2行目の最初のテストをスキップただし、2行目にはテストが適用されないため、問題はありません。 )
G
パターンスペースに改行文字と予約済みスペースを追加します。
/^\(.*\)\n\1$/d
改行の後ろの部分(予約済みスペースから追加された部分など)が改行の前の部分と正確に一致すると、パターンスペースの内容が削除されます(したがって次の行にジャンプ)。ここで重複したヘッダーを含む行は削除されます。
s/\n.*$//
G
ファイルのテキスト行のみを印刷するようにコマンドで追加されたテキスト部分を削除します。
ただし、正規表現はコストがかかるため、やや高速な方法は同じ条件(否定)を使用し、改行の後ろのP
部分(たとえば、予約されたスペースに追加された部分)の場合は改行に印刷することです。いいえ改行の前部分を正確に一致させ、無条件のパターン空間を削除します。
sed '1{h;n;};G;/^\(.*\)\n\1$/!P;d' input
入力が与えられると、出力は次のようになります。
ID Data1 Data2
1 100 100
2 100 200
3 200 100
4 100 100
5 200 200