วิธีผนวกไฟล์. txt หลายไฟล์ไว้ในไฟล์เดียวโดยไม่มีบรรทัดส่วนหัว


0

ฉันมีไฟล์. txt 100,000 ไฟล์ที่มีรูปแบบด้านล่าง:

bygrp,colnum,beta
100005,1,0.629519434191718
100005,2,-0.500000000026516
100005,3,0.560850895321124
100005,4,0.119624318119292
100005,5,0.257676682753309

และชื่อไฟล์คือ Job19_beta1.txt, ... , job19_beta100000.txt

ฉันได้สร้าง total.txt ซึ่งมีเฉพาะบรรทัดส่วนหัว: bygrp, colnum, beta

ฉันต้องการผนวกเฉพาะแถวที่ 3 (colnum = 2 ในตาราง) จาก 100,000 ไฟล์ไปยัง total.txt โดยไม่มีส่วนหัว

ฉันจะเขียนสคริปต์เพื่อทำมันได้อย่างไร? ฉันคิดว่าฉันต้องเขียนเพื่อ ... ทำ ... วนซ้ำแล้วคัดลอก แต่ไม่สามารถหาได้ ...

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


2
ดูเหมือน [คำถามนี้] [1] คล้ายกันมาก [1]: stackoverflow.com/questions/14939327/ …
Xupicor

@Xupicor เขียนคำตอบแล้ว :)
Davidenko

1
@ Davididenko ฉันได้ - บิตมันเป็นเรื่องเล็กน้อยและดังนั้นจึงถูกแปลงเป็นความคิดเห็นโดยอัตโนมัติ : P ก็ดีเช่นกันเพราะฉันต้องการแสดงความคิดเห็น - แต่ยังไม่มีสิทธิ์ ;)
Xupicor

คำตอบ:


0

หากต้องการอ่านชื่อไฟล์จากไฟล์:

while IFS= read -r filename; do
    sed 1d "$filename"
done < a.txt >> total.txt

มีประสิทธิภาพมากขึ้นโดยที่คุณไม่ต้องเรียกใช้ sed สำหรับไฟล์ทุกไฟล์:

xargs awk 'FNR != 1' < a.txt >> total.txt

ที่จะรวบรวมอาร์กิวเมนต์ไฟล์จำนวนมากเพื่อ awk ตามคำสั่งที่สามารถเก็บได้


0

การทดสอบ bash ใน linux (ไม่สามารถรับประกันได้สำหรับ windows) สิ่งนี้ดูมีแนวโน้ม:

for i in (*.txt)
do
tail -n +2 "$i" >> total.txt
done

-n +2สำหรับtailoutputs บรรทัดที่ 2 เป็นต้นไปข้ามเพียงบรรทัดแรก

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

for i in $(cat a.txt)
do
tail -n +2 "$i" >> total.txt
done

หรือการใช้findงานก็ควรทำงานด้วยเช่นกันอาจง่ายกว่านี้หากไฟล์ข้อความทั้งหมด 100,000 ไฟล์อยู่ในโครงสร้างโฟลเดอร์เดียวกันและคุณต้องทำการขุด

find folder/ -name "*.txt" -exec tail -n +2 '{}' >> total.txt  \;

0

ฉันต้องการผนวกข้อมูลทั้งหมดจาก 100,000 ไฟล์ไปยัง total.txt แต่ไม่มีส่วนหัวเนื่องจากมีอยู่ใน total.txt

ในกรณีนั้นและการใช้เครื่องมือทุบตีและยูนิกซ์:

tail -qn +2 job19_beta{1..100000}.txt >>total.txt

มันทำงานอย่างไร

  • job19_beta{1..100000}.txtขยายไปยังรายชื่อของไฟล์ที่คุณต้องการในลำดับที่ถูกต้องของพวกเขา

  • tail -qn +2 job19_beta{1..100000}.txt

    สิ่งนี้เขียนเพื่อ stdout เนื้อหาของไฟล์ทั้งหมดที่เริ่มต้นด้วยบรรทัด 2

    -n +2บอกtailให้เริ่มต้นด้วยบรรทัด 2 -qบอกtailให้เงียบและไม่พิมพ์ส่วนหัวเมื่อเปลี่ยนไฟล์

  • >>total.txt

    total.txtสาเหตุนี้ผลลัพธ์ของคำสั่งหางที่จะผนวกเข้ากับ

ทางเลือกโดยใช้ a.txt

หากคุณต้องการอ่านชื่อไฟล์จากa.txt:

while IFS= read -r fname; do tail -n +2 "$fname"; done <a.txt >>total.txt

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

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