sed または awk は、行の一部を行の最後までコピーして、行形式を再指定します。

sed または awk は、行の一部を行の最後までコピーして、行形式を再指定します。

SQLITEデータベースにインポートする前に編集したいCSVファイルがあります。数千行ありますが、行の一部をコピーしてパイプ「|」を使用して最後に追加したいと思います。簡単に分離してデータベースにインポートできます。

CSVには次の行が含まれています。

989155126903533568|2018-04-25|14:52:14|GMT|report|"""Умственно отстал"" was checked -  http://steamcommunity.com/profiles/76561198402636850 …"|0|0|0|
989154874184085505|2018-04-25|14:51:14|GMT|report|"""Clavicus Vile"" was checked (8 reports) -  http://steamcommunity.com/profiles/76561198006267103 …"|0|0|0|
989154622890823685|2018-04-25|14:50:14|GMT|report|"""~TAKA~"" was checked (3 reports) -  http://steamcommunity.com/profiles/76561198161608591 …"|0|0|0|

765番号をコピーして、次のように行末に追加したいと思います。

989154622890823685|2018-04-25|14:50:14|GMT|report|"""~TAKA~"" was checked (3 reports) -  http://steamcommunity.com/profiles/76561198161608591 …"|0|0|0|76561198161608591

CSVの各行に対してこれを行いたいと思います。したがって、for ループが必要な場合があります。わかりません。

答え1

sed解決策:

sed -E 's/.*\/profiles\/([0-9]+).*/&\1/' file.csv

出力例:

989155126903533568|2018-04-25|14:52:14|GMT|report|"""Умственно отстал"" was checked -  http://steamcommunity.com/profiles/76561198402636850 …"|0|0|0|76561198402636850
989154874184085505|2018-04-25|14:51:14|GMT|report|"""Clavicus Vile"" was checked (8 reports) -  http://steamcommunity.com/profiles/76561198006267103 …"|0|0|0|76561198006267103
989154622890823685|2018-04-25|14:50:14|GMT|report|"""~TAKA~"" was checked (3 reports) -  http://steamcommunity.com/profiles/76561198161608591 …"|0|0|0|76561198161608591

答え2

そしてawk

awk -F'["/]' '{print $0$(NF-1)}' infile > outfile

print行全体$0と最後の2番目のフィールド$(NF-1)。ここで、フィールド区切り文字は引用符またはスラッシュのセットであり、-F結果はに格納されます。'[...]'"/infileoutfile

答え3

$ sed -E 'h;s/.*(http[^ ]*).*/\1/;s/.*\///;H;x;s/\n//' file
989155126903533568|2018-04-25|14:52:14|GMT|report|"""Умственно отстал"" was checked -  http://steamcommunity.com/profiles/76561198402636850 …"|0|0|0|76561198402636850
989154874184085505|2018-04-25|14:51:14|GMT|report|"""Clavicus Vile"" was checked (8 reports) -  http://steamcommunity.com/profiles/76561198006267103 …"|0|0|0|76561198006267103
989154622890823685|2018-04-25|14:50:14|GMT|report|"""~TAKA~"" was checked (3 reports) -  http://steamcommunity.com/profiles/76561198161608591 …"|0|0|0|76561198161608591

コメント付きのスクリプトsed:

h                        # save a copy of the current line in the "hold space"
s/.*(http[^ ]*).*/\1/    # remove everything but the URL
s/.*\///                 # trim the URL so that only the last bit (the number) is left
H                        # add that last bit to the "hold space" (with a newline in-between)
x                        # swap the "hold space" and the "pattern space"
s/\n//                   # delete that inserted newline
                         # (implicit print at the end)

これはURLが常に次のようになると仮定します。ただURLだけが必要ですいつも空白文字で区切られます。

関連情報