从一个文件复制行并将其粘贴到其他n次

时间:2013-12-16 22:15:28

标签: awk

我有两个文件,如下所示:

file1

t=10
HELLO
AAAAAA
BBBBBB
CCCCCC
DDDDDD
END
t=20
HELLO
EEEEEE
FFFFFF
GGGGGG
HHHHHH
END

file2

HELLO
AAAAAA
BBBBBB
CCCCCC
DDDDDD
111111
222222
333333
END
HELLO
EEEEEE
FFFFFF
GGGGGG
HHHHHH
444444
555555
666666
END

是否可以复制HELLO结束的t = 10和t = 20并将它们粘贴到file2的确切位置,使其像

t=10
HELLO
AAAAAA
BBBBBB
CCCCCC
DDDDDD
111111
222222
333333
END
t=20
HELLO
EEEEEE
FFFFFF
GGGGGG
HHHHHH
444444
555555
666666
END

当然我的文件不是那么小,想象一下我想在一个文件中做超过100000次

在社区的其他成员的帮助下,我创建了这个脚本,但它没有给出正确的结果

for frame in $(seq 1 1 2)
do
add=$(awk '/t=/{i++}i=='$frame' {print; exit}' $file1)

awk -v var="$add" 'NR>1 && NR%9==0 {print var} {print $0}' $file2

done

如果有人能帮助我,我会很感激。

提前致谢

2 个答案:

答案 0 :(得分:1)

您可以尝试关注脚本。它读取file1并将HELLO之前的每一行保存在索引数组中,并在第二个文件中再次找到第HELLO行时提取它的每个位置:

awk '
    NR == 1 { prev_line = $0 }
    FNR == NR {
        if ( $1 == "HELLO" ) {
            hash[ i++ ] = prev_line
        }
        prev_line = $0
        next
    }
    $1 == "HELLO" {
        printf "%s\n", hash[ j++ ]
    }
    { print }
' file1 file2

它产生:

t=10
HELLO
AAAAAA
BBBBBB
CCCCCC
DDDDDD
111111
222222
333333
END
t=20
HELLO
EEEEEE
FFFFFF
GGGGGG
HHHHHH
444444
555555
666666
END

答案 1 :(得分:1)

awk 'BEGIN{FS="\n";RS="END\n"}
   NR==FNR{for(i=2;i<=NF;i++) a[$1]=a[$1]==""?$i:a[$1] FS $i;next}
   {for (i in a) {if ($0~a[i]) printf i ORS $0 RS}
   }' file1 file2

结果:

t=10
HELLO
AAAAAA
BBBBBB
CCCCCC
DDDDDD
111111
222222
333333
END
t=20
HELLO
EEEEEE
FFFFFF
GGGGGG
HHHHHH
444444
555555
666666
END