Awk或Sed:文件注释

时间:2011-01-05 21:30:06

标签: sed awk

你好,我的朋友,我的问题是:

规范:将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
文字文字

3 个答案:

答案 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