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