この使い方を考えてくださいコラム(1):
column -s, -t <<CSV
a,b,c
,ee,ff
CSV
上記のコードスニペットは以下をエクスポートします。
a b c
ee ff
しかし、私は次のようなものを見ることを期待しています。
a b c
ee ff
column
2行目から先行スペース「セル」が削除されているようですが、私はそれを期待して維持したいと思います。
列の空白除去動作を無効にする方法はありますか?標準/推奨回避策提案がありますか?
使ってみようRS(1)しかし、このコマンドについて他に質問があります。rs(1) は、すべての出力を 1 行に出力します。入力配列の外観をコピーする方法は?
答え1
使用幸せ(以前のPerl_6)
Rakuのモジュールが利用可能ですText::CSV
。このモジュールはRFC-4180(およびRFC-4180 / RFC-7111)に準拠したファイルを出力します。言うまでもなく、空の先行セルは保存されます。以下に、さまざまな列区切り記号(タブ)を使用した出力デモを示します。
~$ raku -MText::CSV -e 'my @a = csv(in => $*IN); csv(in => @a, out => $*OUT, sep => "\t");' file
入力例:
a,b,c
,ee,ff
出力例(タブ区切り):
a b c
ee ff
ファイルが大きい場合やCSVファイルを1行ずつ読みたい場合は、下記のリンクをご覧ください。
https://unix.stackexchange.com/a/722776/227738
https://github.com/Tux/CSV/blob/master/doc/Text-CSV.pdf
https://raku.org
答え2
このcolumn
ユーティリティは、各行の先頭と末尾から空の列を削除します。これにより、観測される列が誤ってソートされます。ユーティリティには、この動作を無効にするオプションはありません。
一般的なCSV文書を別の形式(TSVなど)に変換する場合は、MillerなどのCSV認識ツールを使用する方が安全です。
$ mlr --icsv --otsv cat <<END_DATA
a,b,c,"d,e"
,ee,ff,"ok ""hello"""
END_DATA
a b c d,e
ee ff "ok ""hello"""
$ mlr --icsv --opprint cat <<END_DATA
a,b,c,"d,e"
,ee,ff,"ok ""hello"""
END_DATA
a b c d,e
- ee ff ok "hello"
$ mlr --icsv --opprint --barred cat <<END_DATA
a,b,c,"d,e"
,ee,ff,"ok ""hello"""
END_DATA
+---+----+----+------------+
| a | b | c | d,e |
+---+----+----+------------+
| - | ee | ff | ok "hello" |
+---+----+----+------------+
答え3
「非標準」ツールが大丈夫なら、XSVツールキット多少ランダムに区切られたテキストデータの形式を適切に指定できます。
xsv table <<CSV
a,b,c
,ee,ff
CSV
a b c
ee ff
答え4
データは引用符や改行のない「簡単なCSV」なので、カンマは区切りフィールドにのみ表示され、それを使用して目的のawk
効果を得ることができます。
awk -F, 'BEGIN {OFS="\t"} {$1=$1; print}' <<CSV
a,b,c
,ee,ff
CSV
出力
a b c
ee ff