複数の列を含む大きなCSVファイルがあります。最初の列のスペースを削除して新しい列にしたいと思います。
はい...
入力する:
a b,xyz,d e f
a b c,xyz,d e f
a b c d,xyz,d e f
出力:
ab,a b,xyz,d e f
abc,a b c,xyz,d e f
abcd,a b c d,xyz,d e f
答え1
使用sed:
sed 'h;s/,.*/,/;s/ //g;G;s/\n//' data.csv
説明する:
h - stash current line to the hold space
s/,.*/,/ - remove everything after the first comma
s/ //g - remove spaces
G - append the line from the hold space back to the pattern space
s/\n// - remove extra newline, as left by G
答え2
bash
標準ツールで使用:
$ paste -d ',' <( cut -d ',' -f 1 file | tr -d ' ' ) file
ab,a b,xyz,d e f
abc,a b c,xyz,d e f
abcd,a b c d,xyz,d e f
paste
与えられた2つのファイルの入力をコンマで区切って結合します。
最初のファイルは、ファイルの最初のカンマで区切られた列を抽出してスペースを削除するプロセス置換によって生成されます。
2番目のファイルは変更されていない元のファイルです。
答え3
bash
単一のファイルソリューションがあるとしましょうtest.txt
。
#!/bin/bash
while read -r line; do
IFS=',' read -ra fields <<<"$line"
(IFS=','; echo "${fields[0]//\ /},${fields[*]}")
done <"test.txt"
exit
これは以下を利用します。IFScsv値を配列に読み込んで出力します。の各行をtest.txt
文字列として読み取り、その行をコンマ区切りの配列として読み込みます。スペースを削除し、この配列の最初の要素を印刷してから、配列全体を印刷します。引用符付き配列を使用すると、以前にコンマで設定された区切り*
要素が出力されます。ステートメントとサブシェル内のインライン宣言は、スクリプトのIFS
実行の残りの部分の値を保持します。IFS
read
()
IFS
答え4
見事にミラー例:
mlr --csv --implicit-csv-header --headerless-csv-output \ put '$newField=gsub($1," +","")' \ then reorder -f newField input.csv
$1
最初のフィールドです。正規表現検索を適用して置き換えて、新しいフィールドを取得します。