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})_/
(追加の制約を処理するために正規表現を調整したい場合があります)