2014-01-07 46 views
0

我正在使用以下脚本来对已排序集中的唯一字符串进行计数。最终记录的特殊AWK命令

awk '{if (p==$1) print 0,p;else print 1,p} {p=$1}' 1.txt > 2.txt 

Input 
a 
a 
a 
b 
c 
c 
d 
d 
d 

output 
0 a 
0 a 
1 a 
1 b 
0 c 
1 c 
0 d 
0 d 
0 d 

我使用的是1到指定当一组独特的结束和一个新的开始,不过awk不将1添加到最后一集,因为没有下一行来比较它。当没有下一行时,我可以指定一种特殊行为吗?

目前我在shell脚本后面的步骤中添加了处理这个问题的方法,但是我想要一种在awk脚本中执行的方法。

lines=`wc -l sort.txt| cut -d " " -f 1` 
awk -v a=$lines '{if (p==$1) print 0,p;if (p!=$1||NR==a) print 1,p} {p=$1}' sort.txt > index.txt 
+1

不是很清楚你想要什么,因为你的输入文件没有返回输出部分指示的内容。你能交叉检查吗? – fedorqui

+0

尽我所知,他的输入与他的输出相匹配。他预先在每一行加上0或1。 –

+0

@fedorqui感谢您的支持。由于同样的问题导致我无法打印最后一行,因此我没有打印第一行。 – jeffpkamp

回答

1

我能得到这个脚本工作。

awk 'BEGIN{p=$1}{if ($1==p) print 0,p;if (p!=$1&&p!="") print 1,p} {p=$1}END{print 1,p}' 1.txt 


input 
a 
a 
a 
b 
c 
c 
d 
d 
d 


output 
0 a 
0 a 
1 a 
1 b 
0 c 
1 c 
0 d 
0 d 
1 d 
2

您可以使用END {...}块时,AWK处理完所有输入(或已被告知exit)做一些事情。

+0

我已经尝试过这种方式,但是我做到这一点,这只会复制最终的记录(现在1值为1美元)。任何想法如何解决这个问题? – jeffpkamp

+0

我看到你明白了这一点。是的,你只需要手动“关闭”END块中最后看到的字段即可。 –

0

你可能想改变你打印的内容:

awk '{if (p==$1) print 0,$1;else print 1,$1} {p=$1}' 1.txt 
1 a 
0 a 
0 a 
1 b 
1 c 
0 c 
1 d 
0 d 
0 d 
+0

如果我们打高尔夫球:'awk'{$ 2 = $ 1; $ 1 = p!= $ 2; p = $ 2} 1''' –

+0

您能想出一种方法来让1处于最后比起初呢? – jeffpkamp

+0

只需设置$ 2为0/1的值:'awk'{$ 2 = p!= $ 1; p = $ 1} 1''或更易读awk {if(p == $ 1){$ 2 = 0} else {$ 2 = 1}; p = $ 1; print}'' - 或者如果有其他字段,而不是'$ 2'使用'$(NF + 1)' –

0

这打印1在最后一封信。

awk 'NR>1 {print p==$1?0 FS p:1 FS p} {p=$1} END {print 1,$0}' file 
0 a 
0 a 
1 a 
1 b 
0 c 
1 c 
0 d 
0 d 
1 d