列から特定の一致キーワードを選択し、最後の列に貼り付けます。 - Linux

列から特定の一致キーワードを選択し、最後の列に貼り付けます。 - Linux

3番目の列には、正確な5桁の数字を含むCSV形式のデータがあります。この番号をコピーして最後の列に貼り付ける必要があります。

2020-05-19_19:03:07,210,HR051919040_to_17622_is_ok.   
2020-05-19_19:03:07,200,MP051919032700_to_Average_95840_is_ok.   
2020-05-19_19:03:07,200,   
2020-05-19_19:03:07,200,RJ0515_to_System__to_66638_is_nok.   

出力:

2020-05-19_19:03:07,210,HR051919040_to_17622_is_ok.,17622   
2020-05-19_19:03:07,200,MP051919032700_to_Average_95840_is_ok.,95840   
2020-05-19_19:03:07,200,,   
2020-05-19_19:03:07,200,RJ0515_to_System__to_66638_is_nok.,66638  

sedを使って5桁の数字を検索してみましたが、文字も含まれていてうまくいきませんでした。

sed -n '/\b[0-9]\{5\}\b/p'

答え1

awkを使用できますmatch

$ awk -F, 'BEGIN{OFS=FS} match($3,/_[0-9]{5}_/){$(NF+1) = substr($3,RSTART+1,RLENGTH-2)} 1' file.csv
2020-05-19_19:03:07,210,HR051919040_to_17622_is_ok.,17622
2020-05-19_19:03:07,200,MP051919032700_to_Average_95840_is_ok.,95840
2020-05-19_19:03:07,200,
2020-05-19_19:03:07,200,RJ0515_to_System__to_66638_is_nok.,66638

substr一致に先行および末尾の下線を含めてから、フィールドの他の場所で5桁のシーケンスと一致しないように切り取ります。

答え2

$ sed -E 's/_([0-9]{5})_(.*)$/_\1_\2,\1/' file
2020-05-19_19:03:07,210,HR051919040_to_17622_is_ok.,17622
2020-05-19_19:03:07,200,MP051919032700_to_Average_95840_is_ok.,95840
2020-05-19_19:03:07,200,
2020-05-19_19:03:07,200,RJ0515_to_System__to_66638_is_nok.,66638
  • _([0-9]{5})_次の5桁の数字を一致させます。_
  • (.*)$行末と一致
  • _\1_\2,\1元の部分(_\1_\2)を復元して追加します。,\1

あなたの質問のサンプルデータには末尾の空白文字があります。リアルタイムデータ使用量がある場合も同様です。

sed -E 's/_([0-9]{5})_(.*\.)[[:blank:]]+$/_\1_\2,\1/' file

末尾のスペースを削除する代わりに。

答え3

$ perl -nle 'print "$_,",/_(\d{5})_/' ex
2020-05-19_19:03:07,210,HR051919040_to_17622_is_ok.,17622
2020-05-19_19:03:07,200,MP051919032700_to_Average_95840_is_ok.,95840
2020-05-19_19:03:07,200,,
2020-05-19_19:03:07,200,RJ0515_to_System__to_66638_is_nok.,66638

入力の各行について perl -nle

  • 印刷して「、」print "$_,"
  • そして行の数字/_(\d{5})_/

(追加の制約を処理するために正規表現を調整したい場合があります)

関連情報