एक फ़ाइल की तरह दिया
First,Last,Age
Cory,Klein,27
John Jacob,Smith,30
क्या सामग्री को स्थानांतरित करने के लिए कमांड लाइन उपयोगिता है ताकि आउटपुट ऐसा दिखाई दे
First,Cory,John Jacob
Last,Klein,Smith
Age,27,30
एक फ़ाइल की तरह दिया
First,Last,Age
Cory,Klein,27
John Jacob,Smith,30
क्या सामग्री को स्थानांतरित करने के लिए कमांड लाइन उपयोगिता है ताकि आउटपुट ऐसा दिखाई दे
First,Cory,John Jacob
Last,Klein,Smith
Age,27,30
जवाबों:
ruby -rcsv -e 'puts CSV.parse(STDIN).transpose.map &:to_csv' < in.csv > out.csv
CSV पार्सिंग केवल POSIX टूल के साथ आसानी से नहीं किया जाता है, जब तक कि आप सरलीकृत CSV वेरिएंट का उपयोग बिना किसी उद्धरण के करते हैं (ताकि अल्पविराम किसी फ़ील्ड में प्रकट न हो सके)। तब भी यह कार्य टूल के लिए awk या अन्य टेक्स्ट प्रोसेसिंग के साथ करना आसान नहीं लगता है। आप पर्ल के साथ Text::CSV
पायथन का उपयोग कर सकते हैं csv
, आर के साथ read.csv
, सीएसवी के साथ रूबी ,… (ये सभी पर्ल के अलावा संबंधित भाषा के मानक पुस्तकालय का हिस्सा हैं।)
उदाहरण के लिए, पायथन में:
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 | ...
हराएगा, वाक्य-विन्यास।
एक त्वरित और गंदा बैश समाधान:
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"
यदि मैं इस समाधान को ऐसे मामलों को ठीक से संभालता हूं तो मैं आश्वस्त नहीं हूं
सुझाए गए सीमा (कोई उद्धृत नहीं, कोई एम्बेडेड कॉमा नहीं) को देखते हुए, यह जाग में सरल है (जैसा कि पर्ल में एक हजार से अधिक लाइनों को ध्यान में नहीं रखना होगा CSV.pm
, 2300 लाइनों में csv.rb
- अजगर में केवल 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];
}
}
वैसे: दिए गए उदाहरण में अतिरिक्त स्थान था जिसे ओपी ने हटा दिया था; अन्य उदाहरणों ने इस विवरण को संबोधित नहीं किया।
python
, बी)ruby
से कम पोर्टेबल नहीं हैpython
, और सी) यह भी दर्शाता है कि इनपुट / आउटपुट कैसे पारित किया जाए फ़ाइलें। ब्रावो @ ल्लिकोर, और यूनिक्स और लिनक्स में आपका स्वागत है। कृप्या इधर-उधर रहना।