awk:将一行中的分隔文本列拆分为多行

3

我有一个包含五列的文件,第二列包含分隔符文本。我想要将该分隔符文本拆分、去重并打印成行。我已经使用以下命令完成了这个操作。现在我想写一个awk脚本,有人能帮我吗。

awk -F"\t" 'NR>1{print $2}' <input file> | awk -F\| '{for (i = 0; ++i <= NF;) print $i}' | awk '!x[$0]++'

输入文件:

test    hello|good|this|will|be    23421    test    4543
test2    good|would|may|can    43234    test2    3421

输出:

hello
good
this
will
be
would
may
can

1
那么期望的输出是什么?请编辑您的问题以展示给我们。 - Tom Fenech
@TomFenech 感谢您关注此事。我已经进行了编辑。 - Karthik
那么保持顺序很重要吗? - tommy.carstensen
重复的单词应该打印还是不打印? - Jotne
awk '{print $2}' inputfile|sed 's/|/\n/gp'|sort|uniqawk '{print $2}' inputfile | sed 's/|/\n/gp' | sort | uniq - roblogic
3个回答

2
您可以使用这个单行的awk命令:
$ awk '{split($2,a,"|");for(i in a)if(!seen[a[i]]++)print a[i]}' file
will
be
hello
good
this
can
would
may

第二个字段在字符“|”处分割为数组a。只有元素不在seen中时,才会打印a的每个元素,这只在第一次出现时为真。
请注意,键的顺序是未定义的。
为了保留顺序,您可以使用以下内容:
$ awk '{n=split($2,a,"|");for(i=1;i<=n;++i)if(!seen[a[i]]++)print a[i]}' file
< p > split 返回数组 a 中的元素数量,您可以使用它们按照它们出现的顺序循环遍历。


请查看我的帖子,了解如何防止数据顺序被更改。 - Jotne
@Jotne,你的版本会打印重复元素,这与OP所需的输出不符。请看我的编辑,以一种保留顺序但不打印重复项的方式实现。 - Tom Fenech
Op 可能只是忘记了最后一个 good。我没有看到任何关于不打印重复内容的提及。 - Jotne
@Jotne,输出中确实有“good”这个词,只是第一次出现。我的第二个示例重现了问题中的输出。请注意,问题还提到了“去重”,即删除重复项。 - Tom Fenech

0

在看到Tom的答案之前,我已经写了完全相同的内容。如果你想保持单词的顺序不变,那就需要多做一些工作:

awk '
    {
        n = split($2, a, "|")
        for (i=1; i<=n; i++) 
            if (!(a[i] in seen)) {
                # the hash to store the unique keys
                seen[a[i]] = 1
                # the array to store the keys in order
                words[++count] = a[i]
            }
    }
    END {for (i=1; i<=count; i++) print words[i]}
' file

hello
good
this
will
be
would
may
can

1
不需要 END 块,你可以按照它们出现的顺序打印元素(请参见我的编辑)。 - Tom Fenech

0

这是我会如何做的:

awk '{n=split($2,a,"|");for (i=1;i<=n;i++) print a[i]}' file
hello
good
this
will
be
good
would
may
can

或者这样做(这可能会改变输出数据的顺序,但由于某种原因我不确定,在这里它可以正常工作):

awk '{split($2,a,"|");for(i in a) print a[i]}' file
hello
good
this
will
be
good
would
may
can

或者,如果您不喜欢重复输出:

awk '{split($2,a,"|");for(i in a) if (!f[a[i]]++) print a[i]}' file
hello
good
this
will
be
would
may
can

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