Bunun gibi bir dosya verildi
First,Last,Age
Cory,Klein,27
John Jacob,Smith,30
Çıktı böyle görünecek şekilde içerikleri aktarmak için bir komut satırı yardımcı programı var mı
First,Cory,John Jacob
Last,Klein,Smith
Age,27,30
Bunun gibi bir dosya verildi
First,Last,Age
Cory,Klein,27
John Jacob,Smith,30
Çıktı böyle görünecek şekilde içerikleri aktarmak için bir komut satırı yardımcı programı var mı
First,Cory,John Jacob
Last,Klein,Smith
Age,27,30
Yanıtlar:
ruby -rcsv -e 'puts CSV.parse(STDIN).transpose.map &:to_csv' < in.csv > out.csv
CSV ayrıştırma işlemi, tırnak işareti olmadan basitleştirilmiş bir CSV varyantı kullanmadığınız sürece yalnızca POSIX araçlarıyla kolayca yapılamaz (böylece virgül bir alanda görünemez). O zaman bile bu görev awk veya diğer metin işleme aracıyla yapmak kolay görünmüyor. Perl ile Text::CSV
, Python ile csv
, R ile read.csv
, CSV ile Ruby ,… kullanabilirsiniz. (Bunların hepsi Perl hariç ilgili dilin standart kütüphanesinin bir parçasıdır.)
Örneğin, Python'da:
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])
Gönderen /programming//a/2776078 :
$ apt-get install csvtool
Ve sonra dönüştürün
$ csvtool transpose input.csv > ouput.csv
Veya boru hattında
$ ... | csvtool transpose - | ...
... | csvtranspose | ...
bu sözdizimi açısından iyi olurdu.
Hızlı ve kirli bir bash çözümü:
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
hücre kodlanmış "this ""is"" example"
Bu çözüm bu gibi durumlarda düzgün işler eğer ikna değilim
Önerilen sınırlama göz önüne alındığında (alıntı yok, gömülü virgül yok), awk içinde basittir (bin satırdan fazla dikkate almayan perl'de olacağı için CSV.pm
, 2300 satır içi csv.rb
- python'un sadece 450 satırı vardır csv.py
).
Awk için bir örnek:
#!/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];
}
}
Bu arada: verilen örnekte OP'nin kaldırılacağı varsayılan ekstra alan vardı; diğer örnekler bu ayrıntıya değinmemiştir.
python
, b) Bundanruby
daha az taşınabilir değildirpython
ve c) bu da giriş / çıkışın nasıl geçileceğini gösterir Dosyalar. Bravo @luikore ve Unix & Linux'a hoş geldiniz. Lütfen etrafta dolaş.