1

我有一个文件test.txt,内容如下:

$ cat test.txt 
IA/N1143 1
IA/N1144 1
IA/N1147 1
IA/N1850 0
IA/N2004 0
IA/M2850 0
IA/M2004 0
IA/NTST 0
$

我想解析该文件,如下所示sed

N1143;1
N1144;1
N1147;1
N1850;0
N2004;0
M2850;0
M2004;0

因此,只有 N* 和 M* 加上状态 0 和 1 的字符将被发送到输出,用分号分隔。

您能否通过演示如何使用或解析该文件sed来帮助我?grepawk

4

4 回答 4

2

从表面上看,您似乎需要:

sed -n '/^IA\/\([NM][0-9][0-9]*\) \([01]\)$/ s//\1;\2/p' test.txt

默认情况下,该-n方法不打印行。搜索模式查找匹配(非常精确)IA/后跟 N 或 M 和一个或多个数字、一个空格、一个数字 0 或 1 和行尾的行。用 捕获字母和数字字符串\(...\),最后一个数字也是如此;替换遵循用分号而不是逗号分隔字段的示例,如问题中所述;显然,按规定输出逗号但未显示是微不足道的。p仅当匹配时才打印该行(尾随)。

除了逗号与分号的问题外,此答案还假定所需的输出是准确的,并且不应出现 NTST 行。但是,问题中的措辞暗示也许 NTST 行也应该出现。如果是这样,您可以通过在 N 或 M 之后允许任意数量的非空白字符来简化正则表达式:

sed -n '/^IA\/\([NM][^]*\) \([01]\)$/ s//\1;\2/p' test.txt

从那个问题中不清楚应该发生什么,例如:

IA/N 0
IA/N Z 0
于 2013-01-09T11:33:35.153 回答
0
% sed s/^IA.// < test.txt | sed "s/ /;/"

N1143;1
N1144;1
N1147;1
N1850;0
N2004;0
M2850;0
M2004;0
NTST;0

首先删除出现在开头的 IA。然后用分号替换空格

请注意,这也会输出 NTST 行。如果不能打印,请使用 Jonathan 的解决方案。

于 2013-01-09T11:33:07.863 回答
0

如果您愿意,可能可以使用 perl:

perl -F -lane 'if(/\/N[\d]+/||/\/M[\d]+/){$F[0]=~s/.*\///g;print join ";",@F}' your_file

测试如下:

> cat temp
IA/N1143 1
IA/N1144 1
IA/N1147 1
IA/N1850 0
IA/N2004 0
IA/M2850 0
IA/M2004 0
IA/NTST 0

> perl -F -lane 'if(/\/N[\d]+/||/\/M[\d]+/){$F[0]=~s/.*\///g;print join ";",@F}' temp
N1143;1
N1144;1
N1147;1
N1850;0
N2004;0
M2850;0
M2004;0
> 
于 2013-01-09T11:46:04.193 回答
0

这会做你说你想要的(“只有 N* 和 M* 加上状态 0 和 1 的字符将被发送到输出,用分号分隔”):

awk -F'[/ ]' -v OFS=';' '$2~/^[MN]/ && $3~/^[01]$/{print $2,$3}' file

这将通过假设以 M 或 N 开头的文本必须后跟一个数字来产生您发布的预期输出:

awk -F'[/ ]' -v OFS=';' '$2~/^[MN][[:digit:]]/ && $3~/^[01]$/{print $2,$3}' file
于 2013-01-09T12:39:23.643 回答