การแปลงไฟล์เป็นแถวถึงคอลัมน์


15

สมมติว่าฉันมีไฟล์:

file1:

PAPER  TEAM  MANISH NISHA GARIMA JYOUTI ........etc 

File2 ฉันต้องการ:

PAPER    
TEAM
MANISH
NISHA
GARIMA    
JYOUTI

แปลงแถวเป็นคอลัมน์ของ File1


หากไฟล์ของคุณประกอบด้วยมากกว่าหนึ่งบรรทัดและผลลัพธ์ของคุณควรมีมากกว่าหนึ่งคอลัมน์ให้ลองใช้สคริปต์ AWKนี้
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

คำถามที่เกี่ยวข้องมาก: askubuntu.com/q/461144/295286
Sergiy Kolodyazhnyy

คำตอบ:


20

ใช้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พิมพ์ผลลัพธ์ที่จะเป็นแถวแรกในคอลัมน์แรกแถวที่สองในคอลัมน์ที่สอง ฯลฯ แน่นอนว่าไฟล์อินพุตนั้น จำกัด ขนาดหน่วยความจำของคุณ


ฉันลองด้วยข้อมูลและรหัสเดียวกันมันพิมพ์คอลัมน์สุดท้ายเป็นระเบียนแรกเช่น 4 d% จากนั้นจึงบันทึก 2 1 a # เป็นต้น
Abhinay

8

คุณสามารถทำสิ่งนี้ผ่าน grep ตามค่าเริ่มต้น grep จะพิมพ์การแข่งขันในบรรทัดใหม่แยกต่างหาก

grep -oP '\S+' infile > outfile

หรือ

grep -o '[^[:space:]]\+' infile > outfile

1
+1 สำหรับการใช้งานอย่างสร้างสรรค์grep
Volker Siegel


7

ด้วยGNU datamash :

$ datamash -W transpose <file
PAPER
TEAM
MANISH
NISHA
GARIMA
JYOUTI

datamashดูเหมือนจะเป็นเครื่องมือที่ดีที่สุดสำหรับงาน แต่น่าทึ่งว่าสามารถใช้เครื่องมืออื่น ๆ อีกมากมายได้!
Mark Stewart

6

คุณสามารถทำได้โดยใช้sed:

$ sed -e 's/  */\n/g' file1 > file2

หมายเหตุ:ไม่จัดการสถานการณ์ที่คำนั้นมีช่องว่าง


นี่ต้องใช้ GNU sed อย่างดีที่สุดเท่าที่ฉันจะบอกได้ เรือที่มาพร้อมกับ mac (BSD) ไม่เห็น\nว่าเป็นบรรทัดใหม่
D. Ben Knoble

5

การใช้การawkตั้งค่าตัวคั่นฟิลด์เอาต์พุต ( OFS) เป็นตัวคั่นเร็กคอร์ด (บรรทัด) ( RS):

awk '{OFS=RS;$1=$1}1' file > file2


0

คุณสามารถลองใช้ sed

$ sed -i.bak s@' '@'\n'@g infile.txt

โปรดทราบว่าฉันกำลังใช้@เป็นตัวคั่นสำหรับการดำเนินการทดแทน นี่จะเป็นการสร้างไฟล์สำรอง ในกรณีที่คุณไม่จำเป็นต้องสำรองข้อมูลลบ. bak

$ sed -i s@' '@'\n'@g infile.txt

0

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

0

การใช้xargs(ถูกขโมยจากคำตอบของ souravc ):

xargs -n 1 < File1 > File2

หรือหากจำเป็นต้องทำการฟอร์แมตใหม่ให้ใช้printfสตริงรูปแบบอย่างไรก็ตามอาจจำเป็นต้องใช้:

xargs printf '%s\n' < File1 > File2


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.