สมมติว่าฉันมีไฟล์:
file1:
PAPER TEAM MANISH NISHA GARIMA JYOUTI ........etc
File2 ฉันต้องการ:
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
แปลงแถวเป็นคอลัมน์ของ File1
สมมติว่าฉันมีไฟล์:
file1:
PAPER TEAM MANISH NISHA GARIMA JYOUTI ........etc
File2 ฉันต้องการ:
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
แปลงแถวเป็นคอลัมน์ของ File1
คำตอบ:
ใช้tr
แทนที่อักขระช่องว่างซ้ำ ( ) ด้วย
\n
อักขระขึ้นบรรทัดใหม่ ( )
tr -s ' ' '\n'< infile > outfile
1 2 3 4 1 a # abcd -> 2 b $ # $ @% 3 c @ 4 d%
ด้วยawk
เราสามารถทำได้:
awk '{ for (i=1; i<=NF; i++) RtoC[i]= (RtoC[i]? RtoC[i] FS $i: $i) }
END{ for (i in RtoC) print RtoC[i] }' infile
ซึ่งจะรวมแต่ละตำแหน่งที่ยื่นเข้ามาด้วยกันและEND
พิมพ์ผลลัพธ์ที่จะเป็นแถวแรกในคอลัมน์แรกแถวที่สองในคอลัมน์ที่สอง ฯลฯ แน่นอนว่าไฟล์อินพุตนั้น จำกัด ขนาดหน่วยความจำของคุณ
คุณสามารถทำสิ่งนี้ผ่าน grep ตามค่าเริ่มต้น grep จะพิมพ์การแข่งขันในบรรทัดใหม่แยกต่างหาก
grep -oP '\S+' infile > outfile
หรือ
grep -o '[^[:space:]]\+' infile > outfile
grep
คุณสามารถใช้fmt
คำสั่ง:
~$ cat f
PAPER TEAM MANISH NISHA GARIMA JYOUTI
~$ fmt -1 f
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
ด้วยGNU datamash :
$ datamash -W transpose <file
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI
datamash
ดูเหมือนจะเป็นเครื่องมือที่ดีที่สุดสำหรับงาน แต่น่าทึ่งว่าสามารถใช้เครื่องมืออื่น ๆ อีกมากมายได้!
คุณสามารถทำได้โดยใช้sed
:
$ sed -e 's/ */\n/g' file1 > file2
หมายเหตุ:ไม่จัดการสถานการณ์ที่คำนั้นมีช่องว่าง
\n
ว่าเป็นบรรทัดใหม่
การใช้การawk
ตั้งค่าตัวคั่นฟิลด์เอาต์พุต ( OFS
) เป็นตัวคั่นเร็กคอร์ด (บรรทัด) ( RS
):
awk '{OFS=RS;$1=$1}1' file > file2
ใช้for
วง:
for val in `cat file1` ; do echo $val >> file2; done;
คุณสามารถลองใช้ sed
$ sed -i.bak s@' '@'\n'@g infile.txt
โปรดทราบว่าฉันกำลังใช้@
เป็นตัวคั่นสำหรับการดำเนินการทดแทน นี่จะเป็นการสร้างไฟล์สำรอง ในกรณีที่คุณไม่จำเป็นต้องสำรองข้อมูลลบ. bak
$ sed -i s@' '@'\n'@g infile.txt
Python เวอร์ชั่น:
python -c "import sys;lines=[l.replace(' ','\n') for l in sys.stdin.readlines()];print(''.join(lines))" < input.txt > output.txt
สิ่งนี้ใช้การ<
เปลี่ยนเส้นทางไปสู่ styth ของ python จากinput.txt
และเขียนไปยังoutput.txt
โดยใช้การ>
เปลี่ยนเส้นทาง หนึ่งซับตัวเองอ่านในทุกบรรทัดจากstdin
ลงในรายการของสตริงที่ช่องว่างทั้งหมดจะถูกแทนที่ด้วยการขึ้นบรรทัดใหม่และเราสร้างข้อความทั้งหมดโดยใช้.join()
ฟังก์ชั่น
วิธีอื่นในการหลีกเลี่ยงช่องว่างหลายชุดในชุดที่ถูกแทนที่ด้วยการขึ้นบรรทัดใหม่คือการใช้.split()
เพื่อแบ่งบรรทัดลงในรายการคำ ด้วยวิธีนี้เราสามารถมั่นใจได้ว่าแต่ละคำจะถูกคั่นด้วยหนึ่งบรรทัดใหม่เท่านั้น
python -c "import sys;lines=['\n'.join(l.strip().split()) for l in sys.stdin.readlines()];print('\n'.join(lines))" < input.txt > output.txt
การใช้xargs
(ถูกขโมยจากคำตอบของ souravc ):
xargs -n 1 < File1 > File2
หรือหากจำเป็นต้องทำการฟอร์แมตใหม่ให้ใช้printf
สตริงรูปแบบอย่างไรก็ตามอาจจำเป็นต้องใช้:
xargs printf '%s\n' < File1 > File2
ทางออกของฉันจะเป็น:
#!/bin/bash
cols=$(head -1 file.txt | wc -w)
for i in $(seq 1 $cols); do
cut -d ' ' -f$i file.txt | tr '\n' ' ' | sed s'/.$//'
echo
done
awk '{for (i=1;i<=NF;i++) {print($i)}}' file > File2