awk +一行awk语法只在第二个字段打印一次,如果“true”字匹配

时间:2010-07-23 10:25:23

标签: awk

我不知道怎么用awk做这个 但我的目标是创建awk单行语法,以便打印第二个字段($ 2)if 所有第一个字段($ 1)都是真的

例如

我有文件:

   true my_name_is_lenon
   true my_name_is_lenon
   true my_name_is_lenon
   false my_name_is_lenon
   true my_name_is_lenon

   false my_dog_is_fat
   true my_dog_is_fat
   true my_dog_is_fat

   true I_am_very_tall
   true I_am_very_tall
   true I_am_very_tall

   true my_ball_is_fine
   true my_ball_is_fine

awk将仅打印以下内容:

 I_am_very_tall
 my_ball_is_fine

因为I_am_very_tall,my_ball_is_fine在第一个字段上变为true而没有错误

my_dog_is_fat,my_name_is_lenon因为第一个字段上的假字而未打印

如果第一个字段上没有假字,则规则是打印第二个字段! (在第二个领域的所有相同句子中)

利迪娅

7 个答案:

答案 0 :(得分:7)

这是一种方式:

awk '{if ($1 == "false") {array[$2] = $1} else if (array[$2] != "false") array[$2] = $1} END {for (i in array) if (array[i] == "true") print i}' inputfile

修改

这是多行:

awk '{if ($1 == "false") 
         {array[$2] = $1} 
     else if (array[$2] != "false") 
         array[$2] = $1} 
     END {for (i in array)
             if (array[i] == "true") 
                 print i}
' inputfile

答案 1 :(得分:1)

答案 2 :(得分:0)

我不确定它是否可能作为一个单行班机。至少不容易。 awk绝对需要吗?由于awk只是解决方案的一部分,因此可以使用一种线路外壳解决方案。

例如,这是一个shell单行(只是一个长行):

awk '{ print $2 }' < {infile} | while read line; do grep -i "false $line" {infile} > /dev/null || echo $line; done | uniq

效率不高,但确实有效。

相比之下,我得到的最短awk解决方案大约有25行(如果你愿意的话我可以放在这里 - 发表评论并相应更新)。但这意味着您可以将其保存到文件并执行awk -f alltrue.awk < {infile}。我不确定这个严格的类是perl单行,但是: - )

更好地了解您最终要实现的目标或者目标是什么可能会有用。

答案 3 :(得分:0)

答案 4 :(得分:0)

答案 5 :(得分:0)

答案 6 :(得分:0)

这是一个班轮:

awk '{$1=="false" ? false[$2]="false" : true[$2]="true"} END{for (i in true) if   (!false[i]) {print i} }'

my_ball_is_fine I_am_very_tall