CSVファイルを処理するために、1つのスクリプトに複数のsedコマンドを追加します。

CSVファイルを処理するために、1つのスクリプトに複数のsedコマンドを追加します。

次のCSVファイルがあります。

HEADER
"first, column"|"second "some random quotes" column"|"third ol' column"
FOOTER

そして、次のような結果を見つけてください。

HEADER
first, column|second "some random quotes" column|third ol' column

つまり、FOOTERstart、end、aroundから引用符を削除します|

これまでのところ、このコードはうまくいきます:

sed '/FOOTER/d' csv > csv1 | #remove FOOTER
sed 's/^\"//' csv1 > csv2 | #remove quote at the beginning
sed 's/\"$//' csv2 > csv3 | #remove quote at the end
sed 's/\"|\"/|/g' csv3 > csv4 #remove quotes around pipe

ご覧のように、問題は4つの追加ファイルを生成することです。

追加のファイルを生成せずに単一のスクリプトで同じことを行うことを目的とする別のソリューションがあります。効果はあまり良くありません。

#!/bin/ksh

sed '/begin/, /end/ { 
        /FOOTER/d
        s/^\"//
        s/\"$//
        s/\"|\"/|/g 
}' csv > csv4

ベストアンサー1

まず、Michaelが示したように、これらすべてを1つのコマンドにまとめることができます。

sed '/^FOOTER/d; s/^\"//; s/\"$//; s/\"|\"/|/g' csv > csv1

一部のsed実装ではこれに対処できず、次のことが必要になる場合があります。

  sed -e '/^FOOTER/d' -e 's/^\"//' -e 's/\"$//' -e 's/\"|\"/|/g' csv > csv1

つまり、フィールドが定義されているように見え、フィールド内にフィールドを残してフィールド全体を|削除したい場合です。"この場合、次のことができます。

$ sed '/FOOTER/d; s/\(^\||\)"/\1/g; s/"\($\||\)/\1/g' csv 
HEADER
first, column|second "some random quotes" column|third ol' column

またはGNUを使用してくださいsed

sed -r '/FOOTER/d; s/(^|\|)"/\1/g; s/"($|\|)/\1/g' csv 

Perlも使用できます。

$ perl -F"|" -lane 'next if /FOOTER/; s/^"|"$// for @F; print @F' csv 
HEADER
first, column|second some random quotes column|third ol' column

おすすめ記事