规范:将FILE_2的 字段 注释到FILE_1的相应位置。
字段 由 分隔符对 标记并标识,然后进行识别。
在我知道awk和sed之前,我在python中做了这个工作,有几百行代码。 现在我想看看awk和sed有多强大和高效。 请告诉我一些awk或sed的杰作!
分隔符对可以在FILE_3中配置,但我们假设一对中的第一个分隔符是'标记(数字i)开始',另一个是'标记(数字i)已完成“
示例:
| ----------------- FILE_1 ------------------ |
文字文字
文字blabla
的 Marker_1_start
的 Marker_1_done
任何文字
在blabla之间
的 Marker_2_start
的 Marker_2_done
文字文字
| ----------------- FILE_2 ------------------ |
的 Marker_1_start
11个
1111
的 Marker_1_done
的 Marker_2_start
2222
22个
的 Marker_2_done
预期产出:
| ----------------- FILE_Out ------------------ |
文字文字
文字blabla
的 Marker_1_start
11个
1111
的 Marker_1_done
任何文字
在blabla之间
的 Marker_2_start
2222
22个
的 Marker_2_done
文字文字
答案 0 :(得分:3)
awk '
FNR==NR && /Marker_.*_done/ {sep = ""; next}
FNR==NR && /Marker_.*_start/ {marker = $0; next}
FNR==NR {marker_text[marker] = marker_text[marker] sep $0; sep = "\n"; next}
1 {print}
/Marker_.*_start/ {print marker_text[$0]}
' file_2 file_1
答案 1 :(得分:2)
有几种方法可以解决这个问题。我假设FILE_2
小于FILE_1
并且大小合理。
#!/usr/bin/awk -f
FNR == NR {
if ($0 ~ /^Marker.*start$/) {
flag = 1
idx = $0
next
}
if ($0 ~ /^Marker.*done$/) {
flag = 0
nl = ""
next
}
if (flag) lines[idx] = lines[idx] nl $0
nl = "\n"
next
}
{
print
if (lines[$0]) print lines[$0]
}
运行它:
./script.awk FILE_2 FILE_1
答案 2 :(得分:0)
现在我想看看它有多强大 高效的awk和sed可以
对于这类问题,非常有效。我确信我的代码可以进一步减少。
#!/bin/bash
awk '
FNR == NR {
if ($0 ~ /Marker_1_start/){m1=1;next}
if ($0 ~ /Marker_2_start/){m2=1;next}
if ($0 ~ /Marker_1_done/){m1=0}
if ($0 ~ /Marker_2_done/){m2=0}
if(m1){a[i++]=$0}
if(m2){b[j++]=$0}
}
FNR != NR {
if ($0 ~ /Marker_1_start/){print;n1=1}
if ($0 ~ /Marker_2_start/){print;n2=1}
if ($0 ~ /Marker_1_done/){n1=0}
if ($0 ~ /Marker_2_done/){n2=0}
if(n1)
for (k = 0; k < i; k++)
print a[k]
else if(n2)
for (l = 0; l < j; l++)
print b[l]
else
print
}' ./file_2 ./file_1
$ ./filemerge.sh
text text text
text blabla
Marker_1_start
11
1111
Marker_1_done
any text
in between blabla
Marker_2_start
2222
22
Marker_2_done
text text