วิธีการแปลงจากแถวถึงคอลัมน์?


11

ฉันมีไฟล์. txt ซึ่งมีหมายเลขเรียงลำดับเช่นนี้ (ในแถวเดียวกัน):

106849_01373    106849_01967    106850_00082    23025.7_01059   

ฉันต้องการแปลงพวกเขาเช่นนั้น:

106849_01373
106849_01967
106850_00082
23025.7_01059

ฉันไม่รู้ว่าจะใช้คำสั่งไหน ใครสามารถช่วยฉันด้วยเรื่องนี้?

คำตอบ:


5

นี่คือหนึ่งเดียวกับ xargs

xargs -n1 < file.txt

การสาธิต:

$ cat file.txt                    
106849_01373    106849_01967    106850_00082    23025.7_01059 

$ xargs -n1 < file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059

1
xargs เป็นเครื่องมือที่ยอดเยี่ยมและหากคุณไม่ได้พูดถึงมันฉันจะมี แต่มันมีข้อเสียเปรียบอย่างหนึ่งที่ถ้าคุณไม่ใช้คำสั่งมันจะแทนที่เสียงก้อง และ -n1 บอกให้ xargs เรียกคำสั่งสำหรับทุก ๆ arg ดังนั้นด้วยตัวอย่างนี้คุณจะต้องมีอย่างน้อยหกกระบวนการที่เกี่ยวข้อง (เชลล์จะทำการเปลี่ยนเส้นทาง io, xargs และสี่ echos) สิ่งนี้ไม่ได้เลวร้ายนักในขอบเขตนี้ แต่วัดได้ช้ากว่าที่เอาต์พุตสองพันบรรทัด
hildred

16

ค่อนข้างง่ายด้วยtr:

tr -s '[:blank:]' '\n' <file.txt

ตัวอย่าง:

% cat file.txt                    
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   

% tr -s '[:blank:]' '\n' <file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059

2

คำตอบของ heemayl เป็นวิธีที่จะไป แต่นี่เป็นทางเลือกโดยใช้ Perl:

perl -lane '$,="\n"; print(@F)' file.txt
  • -l: เปิดใช้งานการประมวลผลโดยอัตโนมัติ มันมีเอฟเฟกต์สองอย่างแยกกัน ก่อนอื่นมันจะ chomps $ / (ตัวคั่นเร็กคอร์ดอินพุต) โดยอัตโนมัติเมื่อใช้กับ -n หรือ -p ประการที่สองมันกำหนด $ \ (ตัวคั่นเร็กคอร์ดเอาท์พุท) ให้มีค่าของ octnum เพื่อให้คำสั่งการพิมพ์ใด ๆ ที่จะมีตัวคั่นนั้นเพิ่มกลับมา หากไม่ระบุ octnum ให้ตั้งค่า $ \ เป็นค่าปัจจุบันของ $ /
  • -a: เปิดโหมด autosplit เมื่อใช้กับ -n หรือ -p คำสั่ง split โดยปริยายไปยังอาร์เรย์ @F นั้นทำขึ้นเป็นสิ่งแรกภายใน implicit ขณะที่ loop สร้างโดย -n หรือ -p
  • -n: ทำให้ Perl ถือว่าวนรอบต่อไปนี้รอบโปรแกรมของคุณ, ซึ่งทำให้วนซ้ำอาร์กิวเมนต์ของชื่อไฟล์ค่อนข้างจะเหมือนกับ sed -n หรือ awk:

    LINE:
      while (<>) {
          ...             # your program goes here
      }
  • -e: อาจใช้เพื่อป้อนโปรแกรมหนึ่งบรรทัด;

  • $,="\n": ตั้งค่าตัวคั่นฟิลด์เอาต์พุตเป็นบรรทัดใหม่;
  • print(@F): พิมพ์ฟิลด์ที่คั่นด้วยตัวคั่นฟิลด์เอาต์พุต
% cat file.txt
106849_01373    106849_01967    106850_00082    23025.7_01059 
% perl -lane '$,="\n"; print(@F)' file.txt
106849_01373
106849_01967
106850_00082
23025.7_01059

1

AWKเข้าใกล้ โดยทั่วไปจะเปลี่ยนตัวแยกเอาต์พุตสำหรับฟิลด์และการวนซ้ำ ไฟล์ทดสอบเป็นตัวอย่างของคุณที่ถูกวางซ้ำแล้วซ้ำอีกกับ ENDLINE ในตอนท้าย

$ awk 'BEGIN{OFS="\n"}{for(i=1;i<=NF;i++) print $i}' some_data 
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE
106849_01373
106849_01967
106850_00082
23025.7_01059
ENDLINE

1

การใช้sed:

sed -e 's/\s\{1,\}$//' -e 's/\s\+/\n/g' file.txt > split_file.txt

ไม่มาก .. มันจะเพิ่มขึ้นบรรทัดใหม่หลังจากแต่ละบรรทัด (เริ่มต้น) ..
heemayl

ตรวจสอบกับหลายบรรทัดคุณจะได้รับเป็นกรณีที่ชัดเจนแล้ว ..
heemayl

คุณสามารถเพิ่มตัวอย่างกับคำตอบของคุณ ..
heemayl

@heemayl คุณหมายถึงจะเปลี่ยนช่องว่างต่อท้ายเป็นบรรทัดใหม่ ไวยากรณ์ของคุณไม่ทำให้เข้าใจง่าย : /
techraf

1

ฉันเพิ่งเพิ่ม Python solution เพื่อความสนุกสนาน:

python3 -c 'import sys; f=open(sys.argv[1]); print(*f.read().split(),sep="\n")' mytestfile

คำสั่งนี้เรียกใช้สคริปต์ Python 3 แบบบรรทัดเดียวใน 'อัญประกาศเดี่ยว' พร้อมชื่อไฟล์ที่คุณต้องการแปลงเป็นอาร์กิวเมนต์ในท้ายที่สุด ไวยากรณ์เป็นดังนี้:

python3 -c 'PYTHON_COMMAND_OR_1-LINE-SCRIPT' ARGUMENTS

สคริปต์ 1 บรรทัดที่เราใช้คือ (ขยายเป็นหลายบรรทัดเพื่อความชัดเจน):

import sys
f=open(sys.argv[1])
print(*f.read().split(),sep="\n")

มันนำเข้าsysโมดูลเพื่ออ่านอาร์กิวเมนต์บรรทัดคำสั่งใช้อาร์กิวเมนต์แรกที่กำหนดเป็นชื่อไฟล์เพื่อเปิดและพิมพ์แต่ละอันแยกช่องว่างข้อมูลจากไฟล์ในบรรทัดเดียว

$ cat mytestfile 
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   
106849_01373    106849_01967    106850_00082    23025.7_01059   

$ python3 -c 'import sys; f=open(sys.argv[1]); print(*f.read().split(),sep="\n")' mytestfile
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
106849_01373
106849_01967
106850_00082
23025.7_01059
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.