การเพิ่มแถวที่กำหนดเองลงในไฟล์โดยใช้เชลล์สคริปต์


2

ฉันมีไฟล์ข้อความที่มีจำนวนแถวโดยพลการสามเท่าดังนี้:

4   5   2
12  16  6

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

4   5   2   (original row)
3   5   1   (added rows)
5   5   1
4   4   1
4   6   1
12  16  6   (original row)
11  16  3   (added rows)
13  16  3
12  15  3
12  17  3

มันไม่สำคัญว่าจะต่อท้ายแถวไหนดังนั้นก็โอเคถ้าแถวที่เพิ่มทั้งหมดอยู่ท้ายไฟล์


และคุณไม่สามารถใช้สิ่งที่ดีกว่าการทุบตีเพื่อสิ่งนี้ได้จริง ๆ ?
Ignacio Vazquez-Abrams

ตกลงฉันยินดีที่จะใช้ Perl, PHP หรือ C ++ ด้วย Bash จะสวยที่สุดและหวังว่าจะได้ประสิทธิภาพที่ดีขึ้น คุณมีข้อเสนอแนะอะไร?
Alp

คำตอบ:


3

awk:

#!/usr/bin/awk -f
BEGIN { OFS = "\t" }
{
    print
    print $1 - 1, $2, $3 / 2
    print $1 + 1, $2, $3 / 2
    print $1, $2 - 1, $3 / 2
    print $1, $2 + 1, $3 / 2
}

ขึ้นอยู่กับว่าคุณต้องการฟอร์แมตเอาท์พุตอย่างไร ตัวอย่างด้านบนสมมติว่าแท็บบันทึกการป้อนข้อมูลที่คั่น


ในการลบรายการที่ซ้ำกันหลังจากนี้ให้ส่งออกไปป์ไลน์ sort -n | uniq.

ชุดตัวเลือกที่ไม่พิมพ์ในตอนแรก (และเก็บคำสั่งเดิม) สามารถจัดเก็บค่าที่เห็นในอาร์เรย์และพิมพ์รายการใหม่เท่านั้น:

#!/usr/bin/awk -f
function printnew(a, b, c) {
    if(seen[a, b, c] != 1) {
        seen[a, b, c] = 1
        print a, b, c
    }
}

BEGIN { OFS = "\t" }

{
    printnew($1, $2, $3)
    printnew($1 - 1, $2, $3 / 2)
    printnew($1 + 1, $2, $3 / 2)
    printnew($1, $2 - 1, $3 / 2)
    printnew($1, $2 + 1, $3 / 2)
}

1
... และเพื่อความสะอาดจะได้ผลลัพธ์ตามที่ต้องการ sort -n
Chris Nava

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