2016-03-15 77 views
0

我想读fileIn.txt(逗号分隔)和仅匹配第一3个不同的值的行输出fileOut.txt给定的列。例如,我的输入文件看起来像这样:AWK:基于给定列的第一个3个不同的值选择行

fileIn.txt 
#location,day,time 
home,mon,01:00 
office,mon,06:00 
home,mon,10:00 
office,tues,03:00 
home,wed,08:00 
home,wed,11:00 
home,thurs,02:00 
home,fri,01:00 
diner,fri,07:00 
party,fri,09:00 
home,sat,02:00 
mall,sat,06:00 
home,sat,09:00 
beach,sun,01:00 

我只需要选择与第3种不同的天行,让自己的输出文件看起来像这样:

fileOut.txt 
#location,day,time 
home,mon,01:00 
office,mon,06:00 
home,mon,10:00 
office,tues,03:00 
home,wed,08:00 
home,wed,11:00 
+0

可以假定输入文件已经排序了吗? – Jeff

+0

是的,你可以这样认为。 – amatek

回答

1

你的问题有点混乱。但是,如果我理解正确,您希望打印出每周有一天匹配脚本在文件中找到的前三个不同值之一的行。你可以做到这一点与AWK像这样

BEGIN { FS="," } 

{ 
    if(dayCount < 3 && !($2 in days)) { days[$2] = 1; ++dayCount } 
    if ($2 in days) { print } 
} 
+0

谢谢。这工作得很好。 – amatek

1

awk来救援! 包括一个更习惯形式的标题。

$ awk -F, 'NR==1{c[$2]} length(c)<4{c[$2]} $2 in c' file 

#location,day,time 
home,mon,01:00 
office,mon,06:00 
home,mon,10:00 
office,tues,03:00 
home,wed,08:00 
home,wed,11:00 

说明:第一块初始化与第一行值的数组,因为它的初始化之前不能检查的阵列的长度。数组c包含不同的$ 2字段,我们继续添加,直到第二个块中的大小达到4(即,头将有4个不同的值)。在最后一个块中,检查该行是否是其中一个不同的值并进行打印(作为默认操作)。

我不想让它更加神秘,但由于动作是相同

$ awk -F, 'NR==1 || length(c)<4 {c[$2]} $2 in c' file 

这取决于短路逻辑运算不评估长度直到后它的初始化,您可以合并前两个区块为NR==1

+0

你向导...你能解释一下,对我们来说,新手? – Jeff

+0

哇,是的请。 。 。 – amatek

0
awk -F, ' 
    /^#/   {print; next} # keep comments 
    ++seen[$2] == 1 {count++}  # incr counter the first time value is seen 
    count > 3  {exit}   # quit if we have seen 4 values 
        {print}   # otherwise print this line 
' file 
相关问题