เชื่อมต่อไฟล์ข้อความด้วยบรรทัดคำสั่งของ Windows โดยวางบรรทัดนำหน้า


127

ฉันต้องการเชื่อมต่อไฟล์ข้อความที่ค่อนข้างใหญ่และต้องการที่จะทำผ่านบรรทัดคำสั่ง น่าเสียดายที่ฉันมีเพียง Windows และไม่สามารถติดตั้งซอฟต์แวร์ใหม่ได้

type file1.txt file2.txt > out.txt

ช่วยให้ฉันเกือบจะได้สิ่งที่ต้องการ แต่ฉันไม่ต้องการให้บรรทัดแรกของ file2.txt รวมอยู่ใน out.txt

ฉันสังเกตเห็นว่าmoreมี+nตัวเลือกในการระบุบรรทัดเริ่มต้น แต่ฉันไม่สามารถรวมสิ่งเหล่านี้เพื่อให้ได้ผลลัพธ์ที่ต้องการ ฉันทราบว่าสิ่งนี้อาจไม่สามารถทำได้ใน Windows และฉันสามารถแก้ไข out.txt ด้วยมือได้ตลอดเวลาเพื่อกำจัดบรรทัด แต่มีวิธีง่ายๆในการทำจากบรรทัดคำสั่งหรือไม่?

คำตอบ:


136
more +2 file2.txt > temp
type temp file1.txt > out.txt

copyหรือคุณสามารถใช้ ดูcopy /?เพิ่มเติม

copy /b temp+file1.txt  out.txt

4
แน่นอน! ฉันต้องการหลีกเลี่ยงการใช้ไฟล์ชั่วคราว ฉันพยายามใช้วงเล็บท่อและ <เพื่อทำให้มันเป็นคำสั่งเดียว แต่ไม่สามารถไปได้ทุกที่ copyคำสั่งได้เร็วขึ้นมาก แต่มันทำให้ตัวละครย่อยที่สิ้นสุด มีวิธีหลีกเลี่ยงสิ่งนี้หรือไม่?
เจมส์

18
ฉันจะเพิ่มว่าถ้าคุณต้องการเชื่อมต่อไฟล์ทั้งหมดคุณสามารถทำได้copy /b *.txt combined.txtโดยไม่ต้องแสดงรายการไฟล์ทีละไฟล์
Phlucious

1
ดูเหมือนจะแปลงแท็บเป็นช่องว่างมากขึ้นน่าเสียดาย!
Antonio

มีคำสั่งในการดึงไฟล์ต้นฉบับจากไฟล์ที่ผสานหรือไม่
swapnil gandhi

3
@ ghostdog74: ฉันคิดว่ามันจะต้องtype file1.txt temp > out.txtต่อท้ายไฟล์ที่สองจริงๆโดยไม่มีส่วนหัวไปยังไฟล์แรก
Marius

61

ฉันใช้สิ่งนี้และได้ผลดีสำหรับฉัน:

TYPE \\Server\Share\Folder\*.csv >> C:\Folder\ConcatenatedFile.csv

แน่นอนว่าก่อนการวิ่งทุกครั้งคุณต้อง DELETE C:\Folder\ConcatenatedFile.csv

ปัญหาเดียวคือถ้าไฟล์ทั้งหมดมีส่วนหัวไฟล์นั้นจะถูกทำซ้ำในทุกไฟล์


2
เมื่อฉันป้อนชื่อไฟล์สำหรับไฟล์ที่ต่อกันซึ่งหมายความว่าจะอยู่ที่ส่วนท้ายของไฟล์ใน loaction (เรียงตามตัวอักษร) จากนั้น windows ดูเหมือนจะเชื่อมต่อกันสองครั้ง! ฉันลงเอยด้วยการใช้ชื่อไฟล์ 1filename.csv เพื่อไม่มีปัญหา ฉันเดาว่าการเชื่อมต่อลงในโฟลเดอร์อื่นก็น่าจะใช้ได้เช่นกัน ...
SebK

1
หากคุณใช้> แทน >> คุณไม่จำเป็นต้องลบไฟล์ก่อน > เปลี่ยนทิศทางเอาต์พุตและสร้างไฟล์ใหม่ทุกครั้ง >> เปลี่ยนเส้นทางเอาต์พุตและผนวก
Eddie Deyo

1
นี่ข้ามบรรทัดแรกใน file2 ที่ OP ถามถึงได้อย่างไร
Dan Dascalescu

1
ไม่ข้ามบรรทัดแรกในไฟล์ 2 ฉันพลาดส่วนนั้นของคำถาม
Raj More

1
มีคำสั่งในการดึงไฟล์ต้นฉบับจากไฟล์ที่ผสานหรือไม่
swapnil คานธี

21

ฉันมีคะแนนชื่อเสียงไม่เพียงพอที่จะแสดงความคิดเห็นเกี่ยวกับคำแนะนำที่จะใช้*.csv >> ConcatenatedFile.csvแต่ฉันสามารถเพิ่มคำเตือน:

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


2
นี่ข้ามบรรทัดแรกใน file2 ที่ OP ถามถึงได้อย่างไร
Dan Dascalescu

6

ใช้คำสั่ง FOR เพื่อสะท้อนไฟล์ทีละบรรทัดและด้วยตัวเลือก 'ข้าม' เพื่อพลาดบรรทัดเริ่มต้นจำนวนมาก ...

FOR /F "skip=1" %i in (file2.txt) do @echo %i

คุณสามารถเปลี่ยนเส้นทางเอาต์พุตของไฟล์แบตช์ที่มีสิ่งต่างๆเช่น ...

FOR /F %%i in (file1.txt) do @echo %%i
FOR /F "skip=1" %%i in (file2.txt) do @echo %%i

สังเกตว่า% สองเท่าเมื่อใช้ตัวแปร FOR ภายในไฟล์แบตช์



3

ฉันจะใส่สิ่งนี้ในความคิดเห็นถึง ghostdog74 ยกเว้นตัวแทนของฉันต่ำเกินไปดังนั้นต่อไปนี้

more +2 file2.txt > temp
โค้ดนี้จะละเว้นแถวที่ 1 และ 2 ของไฟล์ OP ต้องการที่จะให้ทุกแถวจากไฟล์แรก (เพื่อรักษาแถวส่วนหัว) แล้วยกเว้นแถวแรก (สมมุติแถวส่วนหัวเดียวกัน) ในไฟล์ที่สองเพื่อที่จะยกเว้นเฉพาะ OP more +1แถวส่วนหัวควรใช้

type temp file1.txt > out.txt

ยังไม่ชัดเจนว่าคำสั่งนี้เป็นผลมาจากรหัสใด จะถูกtempผนวกเข้ากับfile1.txt(ตามที่ต้องการ) หรือfile1.txtต่อท้ายtemp(ที่ไม่พึงประสงค์เป็นแถวส่วนหัวจะถูกฝังอยู่ในช่วงกลางของไฟล์ที่เกิด)

นอกจากนี้การดำเนินการเหล่านี้ใช้เวลานานมากกับไฟล์ขนาดใหญ่ (เช่น 300MB)


2

ฉันรู้ว่าคุณบอกว่าคุณไม่สามารถติดตั้งซอฟต์แวร์ใด ๆ ได้ แต่ฉันไม่แน่ใจว่าข้อ จำกัด นั้นแน่นแค่ไหน อย่างไรก็ตามฉันมีปัญหาเดียวกัน (พยายามเชื่อมต่อสองไฟล์โดยมีส่วนหัวเดียวกัน) และฉันคิดว่าฉันจะให้คำตอบอื่นสำหรับผู้อื่นที่มาถึงหน้านี้เนื่องจากมันใช้งานได้ดีสำหรับฉัน

หลังจากลองใช้คำสั่งมากมายใน windows และรู้สึกผิดหวังอย่างมากและยังลองใช้โปรแกรมแก้ไขกราฟิกทุกประเภทที่สัญญาว่าจะสามารถเปิดไฟล์ขนาดใหญ่ แต่ก็ทำไม่ได้ในที่สุดฉันก็กลับไปที่ราก Linux และเปิด Cygwin ของฉัน รวดเร็ว สองคำสั่ง:

cp file1.csv out.csv
tail -n+2 file2.csv >> out.csv

สำหรับfile1.csv800MB และfile2.csv400MB คำสั่งทั้งสองนี้ใช้เวลาไม่เกิน 5 วินาทีในเครื่องของฉัน ในพรอมต์ Cygwin ไม่น้อย ฉันคิดว่าคำสั่ง Linux ควรจะช้าใน Cygwin แต่วิธีนี้ใช้ความพยายามน้อยกว่ามากและง่ายกว่าวิธีใด ๆ ของ windows ที่ฉันสามารถหาได้



0

คุณสามารถลองทำเช่นนี้ได้

type file2.txt >> file1.txt

มันจะต่อท้ายเนื้อหาของ file2.txt ที่ท้าย file1.txt

หากคุณต้องการ file1.txt ต้นฉบับให้ทำการสำรองข้อมูลไว้ก่อน หรือคุณสามารถทำได้

type file1.txt > out.txt
type file2.txt >> out.txt

หากคุณต้องการให้มีการแบ่งบรรทัดที่ท้ายไฟล์แรกคุณสามารถลองใช้คำสั่งต่อไปนี้ก่อนที่จะต่อท้าย

type file1.txt > out.txt
printf "\n" >> out.txt
type file2.txt >> out.txt

0

ความช่วยเหลือสำหรับ copyอธิบายว่าสัญลักษณ์แทนสามารถใช้เพื่อเชื่อมไฟล์หลายไฟล์เข้าด้วยกัน

ตัวอย่างเช่นหากต้องการคัดลอกไฟล์. txt ทั้งหมดในโฟลเดอร์ปัจจุบันที่ขึ้นต้นด้วย "abc" ลงในไฟล์เดียวชื่อ xyz.txt:

copy abc*.txt xyz.txt


-1

สิ่งนี้ใช้Test.txtกับส่วนหัวและต่อท้ายTest1.txtและTest2.txtเขียนผลลัพธ์ไปยังTestresult.txtไฟล์หลังจากแยกส่วนหัวจากไฟล์ที่สองและสามตามลำดับ:

type C:\Test.txt > C:\Testresult.txt && more +1 C:\Test1.txt >> C:\Testresult.txt && more +1 C:\Test2.txt >> C:\Testresult.txt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.