ファイルから2行ごとに削除する方法は?


25

ファイル:

Data inserted into table. Total count 13
No error occurred
Data inserted into table. Total count 45
No error occurred
Data inserted into table. Total count 14
No error occurred
Data inserted into table. Total count 90
No error occurred

期待される出力ファイル:

Data inserted into table. Total count 13
Data inserted into table. Total count 45
Data inserted into table. Total count 14
Data inserted into table. Total count 90

出力がこのように見えるようにします。2行ごとに削除されますが、行間にギャップはありません。


5
2行ごとに削除しますか、または「エラーが発生しませんでした」を含むすべての行を削除しますか?2つの連続した行に「エラーが発生していません」と表示された場合はどうなりますか?
Tulainsコルドバ

1
@ user1598390私は思う...その場合、grep -v "No error occurred" fileこのコマンドは動作するはずです... @paulが答えたもの。出力ファイルには、この部分に「エラーが発生していません」という行は含まれません。
pmaipmui

1
その場合、質問のタイトルは誤解を招きます。
Tulainsコルドバ

回答:


36

sed

sed -e n\;d <file

POSIXの場合awk

awk 'FNR%2' <file

古いawk(などoawk)がある場合は、次のものが必要です。

oawk 'NR%2 == 1' <file

ex

$ ex file <<\EX
:g/$/+d
:wq!
EX

ファイルをその場で編集します。

  • g グローバルコマンドをマークする
  • /$/ すべての行に一致
  • +d 次の行を削除します
  • wq! すべての変更を保存する

このアプローチはアプローチと同じ理想を共有し、sed現在の行の次のすべての行を1行目から削除します。

perl

perl -ne 'print if $. % 2' <file

およびperl6

perl6 -ne '.say if $*IN.ins % 2' <file
perl6 -ne '.say if ++$ % 2' <file

はい...その作業... :) ...最初のものが動作している....私は、第2の1を試してみました...その占い`のawk:構文エラーLINE1のAWK:ニアライン1'を救済
pmaipmui

SED -en \; D <ファイル〜はいその作業@cuonglm ...
pmaipmui

1
私はあなたが貴重なキャラクターを保存するn\;d代わりに使用したと推測しています'n;d'が、-eスイッチとファイルリダイレクトを不必要に使用していると、そのロジックはウィンドウから消えます<
トムフェネク

1
@Geek:これはの短縮版でsed -e 'n;d'、1文字節約できます。
クオンルム

1
@Geek:nコマンドを使用してパターンスペースを標準出力に書き込み-n、パターンスペースを次の行に置き換えます。奇数行はすべてによって印刷されn、偶数行はパターンスペースに読み込まれますが、dコマンドによってすぐに削除されます。
クオンルム

62

2行ごとに削除してこれを解決すると、エラーが発生しやすくなります(たとえば、プロセスが1行ではなく2行の意味のある行を生成する場合があります)。ガベージをフィルタリングする方が良いかもしれません:

grep -v "No error occurred" file

フィルターとして実行できます。ここにゴミパターンを追加して、結果を改善できます。


9
場合によっては2行目が重要であると指摘して+1してください。
カズウルフ

12

GNUの質問に答えるsed

sed '0~2d' file

2行ごとに削除されますが、コンテンツごとにフィルター行を提供したいと思います。

sed '/Data/! d' file

または同じ結果で

sed '/No error/d' file

sed '/ No error / d'ファイル〜目的の出力@Costas
pmaipmui

5
注最後の二つは、書き込む方法を回旋していることgrep Datagrep -v 'No error'
ステファンChazelas

5

以下が使用方法sedです:

sed -n 'p;n' filename

GNUの別の方法sed

sed -n '1~2p' filename

上記のコマンドからの出力:

Data inserted into table. Total count 13
Data inserted into table. Total count 45
Data inserted into table. Total count 14
Data inserted into table. Total count 90

と言うとき、あなたはどういう意味shortest way using sedですか?
クオンルム

g指揮の理由は何ですか?sed -n 'p;n'十分です
コスタ

@cuonglm:簡単な方法を言うことを意味します。ちなみにその言葉を削除しました。:)
セレネサ

@Costas:ありがとう!ただチェックして、そのなしで動作しgます。コマンドからgを削除しました。:)
セレネサ

4

で試すことができますawk

awk 'NR % 2 != 0' file

または、次を含む行のみを印刷できますData inserted

awk '$0 ~ /Data inserted/' file

私はあなたの両方の答えを試してみましたが、両方とも働いています... :)
pmaipmui

3

別の答えとして、vi / vimを使用できます!

qdjddq

そして、ファイルが500行(たとえば)だった場合

250 @ d

そして、タイプを書いて終了する

:バツ

または、何かがうまくいかず、保存したくない場合:

:q!

説明:

q      #Start Recording
 d     #Put the recording into register 'd'
  j    #Move the cursor down
   dd  #Delete the line
     q #Stop recording


250    #Number of repeats
   @d  #Playback the recording in register 'd'.

2

これを行うにはまったく異なる方法があります。

< file paste - - | cut -f1

これは、奇数行にタブが含まれていないことを前提としています。もしそうなら、あなたは別の区切り文字を選ぶ必要があります、例えば:ここに:

< file paste -d: - - | cut -d: -f1

1
最初に質問を見たときにこれを念頭に置いていました... sed巨大なファイル(たとえば20ミリ行)に対して速度テストを実行するのは興味深いことです。とにかく、1本当に、のような、頭痛を避けるため、テキストファイルで発生する可能性は低いです区切り文字を選択するには$'\002'...
don_crissti

@don_crissti yes区切り文字に非印刷文字を使用することをお勧めします。はい、これはsedソリューションよりもかなり高速です。でテストファイルを作成しましたseq 100000000 > 100mil.txtpaste|cut解決策は、ほぼ12対、約7.5秒で終了sedソリューション。再現性があるようです。 grepしかし最速です。標準のGNUツールを備えたUbuntu 14.04。
デジタル外傷

うん、paste+ cut重く...ので、当然その組み合わせはかなり気に高速で自分の仕事のために最適化されている
don_crissti


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.