2

以下のようなテキストファイルがあります。削除したい余分な改行文字がいくつかあります。

LINE1: @Line1Col1 @Line1Col2

LINE2: @Line1Col3 @Line1Col4 @ Line1Col5@

LINE3: @Line2Col1 @Line2Col2 @Line2Col3

LINE4: @Line2Col4@

LINE5: Line2Col5 @

次のように改行文字を削除したい:

@Line1Col1 @Line1Col2 @Line1Col3 @Line1Col4 @Line1Col5@

@Line2Col1 @Line2Col2 @Line2Col3 @Line2Col4@ Line2Col5@

行が @ デリミタで始まり @ デリミタで終わる場合、その行は完全であると定義されます。ファイルには区切り文字 @ が既に存在することに注意してください。たとえば、LINE1 と LINE2 を追加すると、行が完成します。同様に、LINE3、LINE4、および LINE5 を追加すると、別の完全な行が作成されます (各行では、説明のためにデータ LineXcolX が使用されています)。したがって、LINE1 に存在する改行を削除し、LINE2 の改行を保持する必要があります。同様に、LINE3 と LINE4 の改行を削除し、LINE5 の改行を保持する必要があります。間に複数のスペースを入れることができます。したがって、ソリューションにスペースを使用することはできません。

再編集 [実際のファイルのセクションを追加]

私が考えることができるロジックは、前の行が「@」で終わり、現在の行が「@」で始まるという条件でのみ新しい行を保持することでした。ただし、これをシェルに実装する方法や、より良いロジックが可能かどうかはわかりません。

@ 258908159@ 258908159@Subwork=E,Mment=SS09 @ 4@Jun 5 2012 23:24:41 @Jun 5 2012 23:24:00 @ 2@ * "DUMMYI"U 120605 DUMMY DATA @Jun 5 2012 23:26:00 @ 403@ 21@PRCAIE @ 10780093@ -2@ @ -1@ -2@ 1@ 35@ 1@@ -1@ NULL@ -1@ 154@ 1@ 40958044@ 1@ 1@ 3@ 0@ -2@ 1@ @ 258908158@ 258908158@Subwork=E,Mment=SS09 @ 4@Jun 5 2012 23:24: 41 @Jun 5 2012 23:24:00 @ 2@ 3TEST300 @ 2@ 3TEST300 @ 2@ 3TEST3Mment=SS09 @ 4@Jun 5 2012 23:24:41 @Jun 5 2012 23:24:00 @ 2@ 3TEST3Mment=SS09 @ 4@Jun 5 2012 23:24:41 @Jun 5 2012 23:24:00 @ 2@ 3TEST3
END @2012 年 6 月 5 日 23:26:00 @ 402@ 21@ @ 10780093@ -2@ @ -1@ -2@ 1@ 35@ 1@@ -1@ NULL@ -1@ 154@ 1@ 40958044@ 1@ 1@ 3@ 0@ -2@ 0@

#####New Line is required ここで他のすべての改行を削除する必要があります

@ 258908158@ 258908158@Subwork=E,Mment=SS09 @ 4@Jun 5 2012 23:24:41 @Jun 5 2012 23:24:00 @ 2@ * "DUMMYI"U 120605 DUMMY @Jun 5 2012 23:26:00 @ 402@ 21@PRCAIE @ 10780093@ -2@ @ -1@ -2@ 1@ 35@ 1@@ -1@ NULL@ -1@ 154@ 1@ 40958044@ 1@ 1@ 3@ 0@ -2@ 1@ @ 258908157@ 258908157@Subwork=E,Mment=SS09 @ 4@Jun 5 2012 23:24: 41 @Jun 5 2012 23:24:00 @ 2@ 3TEST300 @ 2@ 3TEST300 @ 2@ 3TEST3Mment=SS09 @ 4@Jun 5 2012 23:24:41 @Jun 5 2012 23:24:00 @ 2@ 3TEST3Mment=SS09 @ 4@Jun 5 2012 23:24:41 @Jun 5 2012 23:24:00 @ 2@ 3TEST3
END @2012 年 6 月 5 日 23:26:00 @ 401@ 21@ @ 10780093@ -2@ @ -1@ -2@ 1@ 35@ 1@@ -1@ NULL@ -1@ 154@ 1@ 40958044@ 1@ 1@ 3@ 0@ -2@ 0@

ありがとう。

4

3 に答える 3

1

私の理解では、進行するにつれて行を連結して保存します。現在の行が「@」で始まり、保存された連結ロットが「@」で終わる場合、行の境界にいます。次に、保存されたロットを印刷して、最初からやり直します。

awk '/^@/ && l~/@$/ { print l; l=$0; next } { l=l $0} END { print l }'
于 2012-06-08T10:18:20.173 に答える
0

この単純な Perl プログラムは、あなたが望むことをするはずです。

これは、入力ファイルからの行を連結し、蓄積された文字列に@記号のペアが含まれている場合は、空白で区切られている可能性がある場合に分割することによって機能します。

入力ファイルがコマンド ラインのパラメーターとして想定され、変更されたデータが STDOUT に送信されることに注意してください。

use strict;
use warnings;

my $line;

while (<>) {
  chomp;
  $line .= $_;
  while ($line =~ s/^(.+?\@)\s*(?=\@)//) {
    print $1, "\n";
  }
}

print $line, "\n";

出力(サンプル入力データを使用)

@Line1Col1 @Line1Col2@Line1Col3 @Line1Col4 @ Line1Col5@
@Line2Col1 @Line2Col2 @Line2Col3@Line2Col4@Line2Col5 @

アップデート

実際のファイル データからは、レコードの途中で2 つ@の が一緒になっているように見えるため、上記の方法は機能しません。

しかし、分離されたデータを扱っているようです@。分析すると、レコードごとに 25 フィールド、つまり 26@文字があることがわかります。

@この代替プログラムは、26文字以上になるまでデータを蓄積してから出力します。あなたが投稿した実際のデータで動作するようです。

use strict;
use warnings;

my $line;

while (<>) {
  chomp;
  $line .= $_;
  if ($line =~ tr/\@// >= 26) {
    print ">>", $line, "\n";
    undef $line;
  }
}

print $line, "\n" if $line;
于 2012-06-08T12:47:59.320 に答える
0

これはあなたのために働くかもしれません:

sed ':a;$bb;N;/@ *\n *@/!{y/\n/ /;ba};:b;P;D' file

説明:

で囲まれたものを除くすべての改行を削除します@

  • ループ用のラベルを作成します。:a
  • 最後の改行が 2 番目のラベルの場合b$bb
  • 次の行をパターン スペースに追加します。N
  • @記号で囲まれた改行を探します。/@ *\n *@/
  • そのようなパターンがない場合は、改行をスペースに変換し、ループを label に変換しますa!{y/\n/ /;ba}
  • パターン (すべての改行がすべて準備完了) またはファイルの終わりの状態を検出しました。改行まで印刷します。:b;P
  • 上記の印刷された行を削除し、新しいサイクルを開始します (次の行を読まないでください)。D

より不可解な解決策:

 sed '$!{N;/@ *\n *@/!{s/\(.*\)\n/\n\1/;D}};P;D' file
于 2012-06-08T11:32:56.983 に答える