sed - 如何从某些字符解析文本并发送到以逗号分隔的输出

时间:2013-01-09 11:22:41

标签: parsing text sed

我有一个文件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将被发送到输出,用分号分隔。

您能否通过展示如何使用sedgrepawk解析该文件来帮助我?

4 个答案:

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