awk + 一行awk语法,如果匹配到"true"单词,则仅打印第二个字段一次。

4

我不知道如何使用awk来实现这个功能。但是我的目标是创建一个awk一行语法,以便在所有第一字段($1)都为真时打印第二个字段($2)。

例如:

我有这个文件:

   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

因为我很高,所以在第一个字段上,my_ball_is_fine得到了true而没有false。

由于第一个字段上有false,因此my_dog_is_fat和my_name_is_lenon没有被打印。

规则是:如果第一个字段上没有false,则打印第二个字段!(对于所有第二个字段相同的句子)

lidia

7个回答

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

嗨Dennis, 你能把awk改成radoulov awk吗?(不只是一行) 谢谢 Lidia - lidia
@lidia:好的,但是你的问题中说了“awk一行语法”。 - Dennis Williamson
我认为最好不要一行写完(在脚本中看起来不太好)。 - lidia

1
假设每个块都属于同一类别。
$ awk -vRS= '!/false/' file | uniq | awk '{print $NF}'
I_am_very_tall
my_ball_is_fine

抱歉,这个awk命令不起作用,请尝试以下文件: 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 - lidia

0

这里有另外一种方法:

gawk '{a[$2]=a[$2] || $1=="false"} END {for (i in a) if (!a[i] && i) print i}' a.txt

my_ball_is_fine
I_am_very_tall

0

我不确定是否可能作为一个awk的一行程序来完成,至少不是很容易的。awk是否绝对必要?如果awk只是解决方案的一部分,那么可以使用一行shell命令进行解决。

例如,以下是一个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 的一行代码 :-)

更好地了解您最终想要实现什么或者这是用于什么可能会很有用。


0

还有一个:

awk 'END { 
  for (A in all)  
    if (!(A in ko)) print A
  }
NF { all[$2] } 
$1 == "false" { ko[$2] }
' infile

如果您想保留原始顺序,您需要更多的代码。


0

另一种简洁的解决方案。

awk '
  $1 == "true" && ! ($2 in false) {true[$2]}
  $1 == "false" {false[$2]; delete true[$2]}
  END {for (word in true) print word}
' true.txt

0

这里是一个一行代码:

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

我的球很好 我非常高


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接