awkコマンドを使用したパイプの検索と置換

awkコマンドを使用したパイプの検索と置換

テキストの途中でパイプ()を削除する必要があるため、パイプで区切られた()データ|で列7をgrepしようとしています。|

サンプルファイル:

col1|col2|col3|col4|col5|col6|col7|col8|col9|col10
value1|value2|value3|value4|value5|value6|"value7|text"|value8|value9|value10

|列7に関する質問:テキストの途中から削除する必要があります。value7|text

列7の出力は次のとおりです。value7 text

|ここで、プロセスが機能するように単一の文字列として処理できるように、()パイプを空白に置き換えて、列7に移動するawkコマンドを作成しようとしています。

最終出力は次のようになります。

col1|col2|col3|col4|col5|col6|col7|col8|col9|col10
value1|value2|value3|value4|value5|value6|"value7 text"|value8|value9|value10

提案してください。

ありがとう、

答え1

データは正しい形式のCSVデータとして表示されるため、CSVパーサーを使用できます。

$ csvformat -d '|' file | tr '|' ' ' | csvformat -D '|'
col1|col2|col3|col4|col5|col6|col7|col8|col9|col10
value1|value2|value3|value4|value5|value6|value7 text|value8|value9|value10

これはcsvformat以下で使用されます。csvkit|- 区切りデータをコンマ区切りデータで再フォーマットします。tr次に、残りのパイプ記号を空白に置き換えます。最後に、csvformatカンマ区切りのデータを|--separated 形式に再フォーマットするために再利用されます。

二重引用符は、csvformat必要なときやifを使用するときにのみフィールドに追加されます(この場合、すべてのフィールドに二重引用符が追加されます)。-U 1

答え2

次のawkコマンドを使用してテストするとうまくいきます。

awk -F '"' '{gsub(/\|/," ",$2);print $0}' filename

出力

col1|col2|col3|col4|col5|col6|col7|col8|col9|col10
value1|value2|value3|value4|value5|value6| value7 text |value8|value9|value10

答え3

この試み、

sed 's/\(".*\)|\(.*"\)/\1 \2/g' file

婦人声明:私はこれをお勧めしません。代わりに、このような醜い回避策を導入するのではなく、正常に動作するようにプロセスを修正してください。あなたのデータは一般的なCSV(または「PSV」)であり、適切なCSVパーサーで簡単に読み取ることができます。

次のフィールドがあると問題が発生しますvalue\"6|"value7|test"

関連情報