我不知道怎么用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因为第一个字段上的假字而未打印
如果第一个字段上没有假字,则规则是打印第二个字段! (在第二个领域的所有相同句子中)
利迪娅
答案 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