Awk或Sed:文件注释

Awk或Sed:文件注释,sed,awk,Sed,Awk,你好,我的好朋友,我的问题是: 规范:将文件_2的字段注释到文件_1的相应位置。 字段由一对分隔符进行标记和识别 在我了解awk和sed之前,我就用python做了这项工作,用了几百行代码。 现在我想看看awk和sed有多强大和高效。 请给我看一些awk或sed的杰作 可以在文件_3中配置分隔符对,但假设一对中的第一个分隔符是标记(编号i)开始,另一个是标记(编号i)完成 示例: |-----------------文件_1--------------------------- 文本 文本bla

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

规范:将文件_2的字段注释到文件_1的相应位置。
字段由一对分隔符进行标记和识别

在我了解awk和sed之前,我就用python做了这项工作,用了几百行代码。 现在我想看看awk和sed有多强大和高效。 请给我看一些awk或sed的杰作

可以在文件_3中配置分隔符对,但假设一对中的第一个分隔符是
标记(编号i)开始,另一个是
标记(编号i)完成

示例:
|-----------------文件_1---------------------------
文本
文本blabla
标记1\u开始
标记1\u完成
任何文本
在布拉布拉之间
标记器2\u开始
标记2\u完成
文本文本

|-----------------文件_2---------------------------
标记1\u开始
11
1111
标记1\u完成
标记器2\u开始
2222
22
标记2\u完成

预期输出:
|-----------------文件输出---------------------------
文本
文本blabla
标记1\u开始
11
1111
标记1\u完成
任何文本
在布拉布拉之间
标记器2\u开始
2222
22
标记2\u完成
文本文本

现在我想看看它有多强大 可以使用高效的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
现在我想看看它有多强大 可以使用高效的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

有几种方法可以做到这一点。我假设
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

有几种方法可以做到这一点。我假设
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

@丹尼斯,他没有被邀请参加聚会party@Dennis他没有被邀请参加聚会你说的“星号”是什么意思?我没有输入任何星号。你说的星号是什么意思?我没有键入任何星号。您应该使用
idx=$0
,因为您以后会使用
行[$0]
。如果他的标记文本包含空格,代码将按原样中断。不管怎样,谢谢你的连接思想,从现在起我一定要用它,所以+1。丹尼斯,我想你说得一针见血!好极了
顺便说一下,SiegeX使用ide=$0是正确的。您应该使用
idx=$0
,因为您以后会使用
行[$0]
。如果他的标记文本包含空格,代码将按原样中断。不管怎样,谢谢你的连接思想,从现在起我一定要用它,所以+1。丹尼斯,我想你说得一针见血!好极了
顺便说一句,SiegeX使用ide=$0是正确的。@SiegeX,print语句需要按照特定的顺序,这样标记开始将在标记体之前输出@丹尼斯,是的。@丹尼斯:或者
{print}
是多余的,你自己选吧@SiegeX,print语句需要按照特定顺序,以便标记开始在标记体之前输出@丹尼斯,是的。@丹尼斯:或者
{print}
是多余的,你自己选吧!