在脚本中使用awk gensub的不同结果

时间:2018-10-08 02:58:53

标签: shell awk

在尝试翻转一个由空格分隔的两部分的字符串时,我发现了两种不同的结果,具体取决于处理方式。

方法1:

for smaller_list in list_of_dictionaries2:
    correct2 = defaultdict(list)
    for d in smaller_list:
        for k, v in d.items():
            correct2[k].append(v)
    empty.append(correct2)

方法2:

[defaultdict(<class 'list'>, {0: [3523, 7245], 1: [3524, 7246, 20898],
2: [3540, 7247, 20899], 4: [3541, 20901], 5: [3542, 7249, 20902], 
3: [7248, 20900], 6: [7250]}), 
defaultdict(<class 'list'>, {0: [3],1: [4], 2: [5], 3: [6]})]

有什么作用?我需要在方法1中解决什么?谢谢您的帮助!

2 个答案:

答案 0 :(得分:2)

在正则表达式匹配项中有多余空格的第一个命令中,您难道没有发现明显的错字吗?

echo "ABCD EFGH" | awk '{print gensub ( /( .+ ) ( .+ )/, "\\2 \\1", "g", $0 ) }'
#                                         ^  ^   ^  ^ incorrect spaces defined

它应该被定义如下。同样,您也不需要将$0放在最后一个参数中,这是可以理解的并且是可选的,即,如果未明确提到$0,则默认情况下,该操作将占据整个{{1 }}。

$0

答案 1 :(得分:1)

您已经对正则表达式为什么不起作用的原因进行了解释。因此,我只想指出您正在用GNU awk编写,而gensub()在大多数其他awk中都不存在。

因此,出于可移植性考虑,我建议您以其他方式反转字段:

$ echo "ABCD EFGH" | awk '{for(i=NF;i;i--) o=o OFS $i; print substr(o,length(OFS)+1)}'

这将以相反的顺序遍历您的字段,并将它们附加到一个变量,该变量由输出字段分隔符分隔。然后,它打印该变量,并随即剥离OFS。它还可以用于2个以上字段。