文字列の列23に\ nがあるタブ区切りのテキストファイルがあり、これは次の行に進みます。
スペースが有効なviでテキストファイルを開くと、DESCR2フィールドの値に文字列を区切る空白行があることがわかります。
文字列はタブで区切られた文字内に含まれており、\ nを削除し、1フィールドにある間に文字列をABC 123に連結しようとします。
私はこれを試しましたが、tr -d '\n' < file.txt
すべての行を1行に置き換えます。この列から\n\nを削除したいと思います。
私も試してみましたが、うまくいきませんでしsed 's/\n\n//' file.txt
た。 viで\ n \ nを検索して置き換えることができますが、sedを使用すると同じ結果を得ることはできません。
例:
\t"ABC\n
\n
123"\t
希望の出力:
\t"ABC 123"\t
ベストアンサー1
タブ文字をフィールド区切り文字として使用する正しい形式のCSVファイルがあるようです。示されている例のように、正しく引用されている限り、フィールドに改行を含めることができます。すべてのCSVパーサーはデータを読み取るのに問題はありません。
これらの改行文字を削除するには、次のCSVパーサーを使用できます。csvkit
。
次のサンプルファイルを使って作業します。
$ cat -t file.csv
col1^Icol2^Icol3
col1^I"ABC
123"^Icol3
col1^Icol2^Icol3
それぞれは^I
タブ文字です。 2行目の2番目のフィールドには2つの連続した改行文字が含まれており、これを単一の空白文字で安全に置き換えようとします。
私はCSVデータをJSON文書に変換するcsvjson
fromを使用しています。csvkit
これにより、データを変更するのに少し簡単になり、jq
データをCSV形式に変換するためにも使用できます。
$ csvjson -t -H file.csv | jq -r '.[] | [ .[] | values |= gsub("\n\n";" ") ] | @csv'
"col1","col2","col3"
"col1","ABC 123","col3"
"col1","col2","col3"
ここで使用されるコマンドは、csvjson
CSVファイルの各行をJSONオブジェクトに変換します。この-t
オプションは、入力がタブ文字を区切り文字として使用し、列見出しが-H
ないことをツールに通知します。
JSONオブジェクトを配列に入れて読み取り、値を抽出します(元のCSVファイルにはヘッダーがないか、質問で述べたように少なくともないため、データはなどのキーにjq
割り当てられます)。スペースを使用して簡単な置換を適用します。連続した改行のすべてのペアを交換します。a
b
c
gsub()
gsub()
明らかに、上記の正規表現を変更し\n+
て、連続した改行文字を単一の空白文字に置き換えることができます。
その後、オペレータは@csv
CSV出力形式の配列形式でデータセットを受け取ります。
csvformat
デフォルトのフィールド区切り文字をコンマからタブに戻すには-T
(タブ区切り出力の場合)および(CSV入力にヘッダーなし)オプションを使用して-H
結果をパイプします。
$ csvjson -t -H file.csv | jq -r '.[] | [ .[] | values |= gsub("\n\n";" ") ] | @csv' | csvformat -T -H
col1 col2 col3
col1 ABC 123 col3
col1 col2 col3
csvformat
引用が必要なフィールドは自動的に引用されます。
このcsvformat
ツールも同様ですcsvkit
。
Noteで作成した中間JSON文書はcsvjson
次のとおりです(ローマ化jq
)。
[
{
"a": "col1",
"b": "col2",
"c": "col3"
},
{
"a": "col1",
"b": "ABC\n\n123",
"c": "col3"
},
{
"a": "col1",
"b": "col2",
"c": "col3"
}
]