CSVは新しい列を作成し、スペースを削除します。

CSVは新しい列を作成し、スペースを削除します。

複数の列を含む大きな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実行の残りの部分の値を保持します。IFSread()IFS

答え4

見事にミラー例:

mlr --csv --implicit-csv-header --headerless-csv-output \ put '$newField=gsub($1," +","")' \ then reorder -f newField input.csv

$1最初のフィールドです。正規表現検索を適用して置き換えて、新しいフィールドを取得します。

関連情報