รวมเอาคัตเอาท์ 2 แบบที่แตกต่างกันในคำสั่งเดียว?


15

ฉันมีไฟล์ดังต่อไปนี้:

1234
ABCD
EFGH

ฉันต้องการแปลงให้เป็นดังต่อไปนี้:

2341
BCDA
FGHE

ไฟล์จริงมี 4,000 คำดังนั้นฉันต้องการทำอย่างมีประสิทธิภาพ ฉันลองใช้คำสั่งcut -c 2-4,1 file.txtแต่มันสร้างเอาต์พุตที่แน่นอนเหมือนกับอินพุต ฉันคิดว่าฉันสามารถใช้คำสั่งที่แตกต่างกัน 3 คำ:

cut -c 1 file.txt > temp1.txt
cut -c 2-4 file.txt > temp2.txt
// combine the two with paste or pr

... แต่ฉันต้องการคำสั่งเดียวเพราะฉันต้องเรียกใช้หลายครั้งด้วยการแก้ไขเล็กน้อยดังนั้นการเรียกใช้หนึ่งคำสั่งจะเกิดข้อผิดพลาดน้อยกว่าการรัน 3 คำสั่งในแต่ละครั้ง

มีวิธีใดบ้างที่จะรวมคำแถลงที่ตัด 2 ฉบับเข้าด้วยกัน สิ่งที่ต้องการ:

cut -c 1 file.txt | pr (cut -c 2-4 file.txt)

หรือมีวิธีที่ดีกว่าในการทำเช่นนี้?

คำตอบ:



11

ด้วยcutและpasteคุณยังสามารถทำหนึ่งซับ:

$ cat file
1234
ABCD
EFGH
$ paste --delimiter=''  <(cut file -c2-4) <(cut file -c1)
2341
BCDA
FGHE

+1 สำหรับวางทางลัด เป็นที่เข้าใจง่าย :)
Ankit

นอกจากนี้คุณยังสามารถใช้-d ''แทน--delimiters=''การใช้อักขระจาก LIST แทน
TAB ได้อีกด้วย


3
$ cat test
1234
ABCD
EFGH
$ awk -F "" '{print $2$3$4$1}' test
2341
BCDA
FGHE

คุณสามารถเปลี่ยนตัวคั่นได้ด้วย "-F" ตามข้อมูลของคุณและจัดการลำดับของฟิลด์โดยพลการ


1

นี่เป็นวิธีหนึ่งในperl:

perl -F'' -lane 'print @F[1..@F], $F[0]'

แบ่งอัตโนมัติที่ขอบเขตตัวอักษรหมุนหนึ่งไปทางซ้ายและพิมพ์


0

ฉันพบทางเลือกในลักษณะสคริปต์:

~$ cut -c2- file.txt>file2.txt
~$ cut -c1 file.txt>file3.txt
~$ paste -d "" file2.txt file3.txt>file4.txt
~$ rm file2.txt file3.txt

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

วิธีการแก้ปัญหา llua นั้นสะอาดกว่าสำหรับฉัน


-1

คุณลองหมุนรอบแล้วหรือยัง?

~$ cat filename | rev


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