我有一个文件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 * plus状态0和1将被发送到输出,用分号分隔。
您能否通过展示如何使用sed
,grep
或awk
解析该文件来帮助我?
答案 0 :(得分: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
答案 1 :(得分: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的解决方案。
答案 2 :(得分: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
>
答案 3 :(得分:0)
这可以按你所说的去做(“只有N *&amp; 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