パターンマッチング、改行の追加、行末の単語の追加

パターンマッチング、改行の追加、行末の単語の追加

誰でもこの問題を解決するのに役立ちますか?解凍したファイルがありますが、ファイルの内容は以下のとおりです。

(11213068, 2020-11-16) deleted
(1075227404, 2021-06-14) added
(11213177, 2020-11-16) deleted
(1075227413, 2021-06-14) added
(11213070, 2020-11-16) deleted
(1075193958, 2021-05-28) added
(1075194668, 2022-11-29) added
(1073757334, 2021-01-20) (1073757337, 2021-01-20) (1073757349, 2021-01-20) (1073757331, 2021-01-20) (1073757346, 2021-01-20) added
(1073757237, 2020-11-20) (1073757263, 2020-11-20) (1073757233, 2020-11-20) (1073757241, 2020-11-20) (1073757247, 2020-11-20) deleted

++私が望むファイルの結果はこれです -

(11213068, 2020-11-16) delete
(1075227404, 2021-06-14) add
(11213177, 2020-11-16) delete
(1075227413, 2021-06-14) add
(11213070, 2020-11-16) delete
(1075193958, 2021-05-28) add
(1075194668, 2022-11-29) add
(1073757334, 2021-01-20) add
(1073757337, 2021-01-20) add
(1073757349, 2021-01-20) add
(1073757331, 2021-01-20) add
(1073757346, 2021-01-20) add
(1073757237, 2020-11-20) delete
(1073757263, 2020-11-20) delete
(1073757233, 2020-11-20) delete
(1073757241, 2020-11-20) delete
(1073757247, 2020-11-20) delete

最後の2行では解決策が見つかりません。私はこのコマンドの出力を使用しました。

awk '$3!="added"' | awk '$3!="deleted"' | sed 's/) (/\n/g' file.txt

(11213068, 2020-11-16) deleted
(1075227404, 2021-06-14) added
(11213177, 2020-11-16) deleted
(1075227413, 2021-06-14) added
(11213070, 2020-11-16) deleted
(1075193958, 2021-05-28) added
(1075194668, 2022-11-29) added
(1073757334, 2021-01-20
1073757337, 2021-01-20
1073757349, 2021-01-20
1073757331, 2021-01-20
1073757346, 2021-01-20) added
(1073757237, 2020-11-20
1073757263, 2020-11-20
1073757233, 2020-11-20
1073757241, 2020-11-20
1073757247, 2020-11-20) deleted

時間をいただきありがとうございます。

答え1

これには正しい区切り記号を使用してください。

awk -F') ' '{for (i=1;i<NF;i++) print $i FS $NF}' file

sub()最後のフィールドを置き換える必要がある場合は、ライン処理の開始時に使用するなど、いくつかの方法があります。

awk -F') ' '{sub(/added$/,"add"); sub(/deleted$/,"delete"); for (i=1;i<NF;i++) print $i FS $NF}' file

答え2

GNU sed広範な正規表現パターンがあります-E

  • )
    ( 改行マーカーを使用してサンドイッチ領域を表示します。最後のフィールド(過去の時制クリーンアップ後)は、最初のトークンに送信され、最初のトークンに印刷され、最初のトークンで切り捨てられます。このプロセスはパターンスペースがなくなるまで繰り返されます。

$ sed -Ee '/\n/ba
    /e?d$/s/ (add|delete)e?d$/ \1/
    s/[)] [(]/) \n(/g;:a
    s/(\n.*)?\n.* (\S+)$/\2&/
    /\n.*\n/{P;D;}
' file

$ perl -F'\)\s' -lane '$, = ") ";
    my $l = pop(@F) =~
     s/^(add)ed$/$1/r =~
      s/^(delete)d$/$1/r;
    print $_, $l for @F;
' file

答え3

おそらく2段階のソリューションではないでしょうか?

<infile sed 's/deleted/delete/; s/added/add/' | 
awk 'NF==3; NF>3 { for (i=1; i<NF; i+=2) print $i, $(i+1), $NF }'

答え4

FPATでGNU awkを使用する:

$ awk -v FPAT='[(][^)]+)|\\S+' '{for (i=1; i<NF; i++) print $i, $NF}' file
(11213068, 2020-11-16) deleted
(1075227404, 2021-06-14) added
(11213177, 2020-11-16) deleted
(1075227413, 2021-06-14) added
(11213070, 2020-11-16) deleted
(1075193958, 2021-05-28) added
(1075194668, 2022-11-29) added
(1073757334, 2021-01-20) added
(1073757337, 2021-01-20) added
(1073757349, 2021-01-20) added
(1073757331, 2021-01-20) added
(1073757346, 2021-01-20) added
(1073757237, 2020-11-20) deleted
(1073757263, 2020-11-20) deleted
(1073757233, 2020-11-20) deleted
(1073757241, 2020-11-20) deleted
(1073757247, 2020-11-20) deleted

または本当にこの最後の単語を変更したい場合:

$ awk -v FPAT='[(][^)]+)|\\S+' '
    BEGIN { map["deleted"]="delete"; map["added"]="add" }
    { for (i=1; i<NF; i++) print $i, map[$NF] }
' file
(11213068, 2020-11-16) delete
(1075227404, 2021-06-14) add
(11213177, 2020-11-16) delete
(1075227413, 2021-06-14) add
(11213070, 2020-11-16) delete
(1075193958, 2021-05-28) add
(1075194668, 2022-11-29) add
(1073757334, 2021-01-20) add
(1073757337, 2021-01-20) add
(1073757349, 2021-01-20) add
(1073757331, 2021-01-20) add
(1073757346, 2021-01-20) add
(1073757237, 2020-11-20) delete
(1073757263, 2020-11-20) delete
(1073757233, 2020-11-20) delete
(1073757241, 2020-11-20) delete
(1073757247, 2020-11-20) delete

関連情報