テキストの途中でパイプ()を削除する必要があるため、パイプで区切られた()データ|
で列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"
。