回答:
CSV解析は、引用符なしで単純化されたCSVバリアントを使用していない限り、POSIXツールだけでは簡単に実行できません(コンマがフィールドに表示されないようにするため)。それでも、このタスクはawkやその他のテキスト処理ツールを使用して行うのは簡単ではないようです。Perl with Text::CSV
、Python with csv
、R with read.csv
、Ruby with CSVなどを使用できます(これらはすべて、Perlを除くそれぞれの言語の標準ライブラリの一部です。)
たとえば、Pythonの場合:
import csv, sys
rows = list(csv.reader(sys.stdin))
writer = csv.writer(sys.stdout)
for col in xrange(0, len(rows[0])):
writer.writerow([row[col] for row in rows])
$ apt-get install csvtool
そして変換する
$ csvtool transpose input.csv > ouput.csv
またはパイプラインで
$ ... | csvtool transpose - | ...
... | csvtranspose | ...
構文的にはそれだけに勝るでしょう。
迅速で汚れたbashソリューション:
c=1
file=file.txt
num_lines=$(wc -l < "$file")
for ((i=0; i<num_lines; i++)) {
cut -d, -f$c "$file" | paste -sd ','
((c++))
}
for ((i=1; i<=$num_cols; ++i)); do paste -s -d, <(cut -f$i -d, file.txt); done
this "is" example
セルがエンコードされている"this ""is"" example"
私は、このソリューションのハンドルこのような場合であれば、適切に納得していないです
提案された制限(引用符なし、埋め込みコンマなし)を考えると、それはawkで簡単です(perlでは1000行以上CSV.pm
、2300行csv.rb
— Pythonには450行しかありませんcsv.py
)。
awkの例を次に示します。
#!/usr/bin/awk -f
BEGIN { width=0; }
{
max = split($0, list, ",");
# printf "%d:%s\n", NR, $0;
if (width < max)
width = max;
for (n = 1; n <= max; ++n) {
sub("^[ ]*","",list[n]);
sub("[ ]*$","",list[n]);
# printf "\t%d:%s\n", n, list[n];
if ( columns[n] != "" ) {
columns[n] = columns[n] ", ";
}
columns[n] = columns[n] list[n];
}
}
END {
# printf "%d columns\n", width;
for (n = 1; n <= width; ++n) {
printf "%s\n", columns[n];
}
}
ちなみに、指定された例には、OPが削除すると想定した余分なスペースがありました。他の例では、この詳細に対処していません。
python
、b)ruby
移植性は劣らずpython
、c)これは入出力を渡す方法も示していますファイル。Bravo @ luikore、UnixおよびLinuxへようこそ。頑張ってください。