最初の行を除いて、ファイルから追加のヘッダー行を削除します。

最初の行を除いて、ファイルから追加のヘッダー行を削除します。

このおもちゃの例に似たファイルがあります。私の実際のファイルには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
  1. 入力ファイルのヘッダー行を変数として取得します。
  2. タイトル印刷
  3. grepヘッダーに一致する行を省略するようにファイルを処理します。
  4. 上記の2つのステップの出力を出力ファイルとしてキャプチャします。

答え3

校正装置が好きではない人のために

sed -e '1n' -e '/^ID/d'
  • npass行番号を示します。1
  • d次に始まる一致するすべての行を削除します。^ID

答え4

これは興味深いものです。sedを使用して、最初の行のすべてのコピーを削除し、他のすべての項目(最初の行自体を含む)を保持できます。

sed '1{h;n;};G;/^\(.*\)\n\1$/d;s/\n.*$//' input

1{h;n;}sed最初の行を予約済みスペースに入れて印刷し、次の行を読みます。最初の行の残りのコマンドはスキップされます。 (それも同じだ。12行目の最初のテストをスキップただし、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

関連情報