csv行にx個以上のパイプがある場合は、2番目のインスタンスを削除します。

csv行にx個以上のパイプがある場合は、2番目のインスタンスを削除します。

製品番号、タイトル、URL、価格を含む4つのデータ列を含める必要があるcsvファイルがあります。各列は|区切り文字で区切られています(これは保持する必要があり、ここでは議論しないが代替区切り文字に切り替えることができない他の理由があります)。一番下の項目(この例では問題のある項目)に示すように、ヘッダーにパイプが含まれているため、スキーマを破損してデータをデータベースにインポートする必要がある場合に問題が発生する可能性があります。

5456435121|The making of the blue album|https://www.example1.co.uk|55
1321354567|Wow this example has no imagination|https://www.cherrypickers.co.uk|89
5456456456|King of the Barbarians | Last Man Standing|https://www.babarians.co.uk|79

私が知りたいのは、ファイルを効果的に解析し、3つ以上のパイプを持つすべての行(つまり、ヘッダーにパイプを含むすべての行)に対して2行目を削除するコマンドを実行する方法です。これにより、ヘッダーに1つ以上のパイプがある場合は、パイプを効果的に削除できます。どのように実装するのかわかりません。

処理後にファイルが次のように見えるようにしたいと思います。

5456435121|The making of the blue album|https://www.example1.co.uk|55
1321354567|Wow this example has no imagination|https://www.cherrypickers.co.uk|89
5456456456|King of the Barbarians Last Man Standing|https://www.babarians.co.uk|79

答え1

sed -r ':;s/(\|.*)\|(.*\|.*\|)/\1\2/;t'

前に1つのパイプがあり、後に2つのパイプが来るすべてのパイプを削除します。

ファイルをその場で編集するには、-iオプションを使用します。

関連情報