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}
是多余的,你自己选吧!