รับไฟล์แบบนี้
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 หรือเครื่องมือประมวลผลข้อความอื่น คุณสามารถใช้ Perl กับText::CSV
, Python กับcsv
, R กับread.csv
, Ruby กับ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])
จาก /programming//a/2776078 :
$ 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"
ฉันไม่มั่นใจว่าวิธีการแก้ปัญหานี้จะจัดการกับกรณีดังกล่าวได้อย่างถูกต้องหรือไม่
ด้วยข้อ จำกัด ที่แนะนำ (ไม่มีการอ้างอิงไม่มีเครื่องหมายจุลภาค) มันง่ายใน awk (เพราะมันจะอยู่ใน perl โดยไม่คำนึงถึงมากกว่าหนึ่งพันบรรทัดใน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];
}
}
โดยวิธีการ: ตัวอย่างที่กำหนดมีพื้นที่พิเศษซึ่ง OP สันนิษฐานว่าจะถูกลบออก; ตัวอย่างอื่น ๆ ไม่ได้ระบุรายละเอียดนี้
python
, b)ruby
ไม่สามารถเคลื่อนย้ายได้น้อยกว่าpython
และ c) สิ่งนี้ยังแสดงวิธีผ่านอินพุต / เอาท์พุต ไฟล์ Bravo @luikore และยินดีต้อนรับสู่ Unix & Linux กรุณาทำรอบ ๆ