Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
awk:将行中的分隔文本列拆分为行_Awk - Fatal编程技术网

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

awk:将行中的分隔文本列拆分为行,awk,Awk,我有一个有五列的文件,第二列有分隔文本。我想分割分隔文本,消除重复并打印成行。我可以用下面的命令来做。我想做一个awk脚本。有人能帮我吗 awk -F"\t" 'NR>1{print $2}' <input file> | awk -F\| '{for (i = 0; ++i <= NF;) print $i}' | awk '!x[$0]++' 输出: hello good this will be would may can 您可以使用此单awk单衬套: $ aw

我有一个有五列的文件,第二列有分隔文本。我想分割分隔文本,消除重复并打印成行。我可以用下面的命令来做。我想做一个awk脚本。有人能帮我吗

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

hello
good
this
will
be
would
may
can

您可以使用此单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
。如果
a
的每个元素尚未出现在
seen
中,则将打印该元素,这仅在第一次出现时才为真

请注意,键的顺序未定义


要保留顺序,可以使用以下命令:

$ awk '{n=split($2,a,"|");for(i=1;i<=n;++i)if(!seen[a[i]]++)print a[i]}' file

$awk'{n=split($2,a,“|”);for(i=1;i我在看到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

以下是我将如何做到这一点:

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) if (!f[a[i]]++) print a[i]}' file
hello
good
this
will
be
would
may
can

那么期望的输出是什么呢?请将您的问题告诉我们。@TomFenech感谢您的关注。我已经做了编辑。所以保留顺序很重要?是否应该打印重复的单词?在bash中执行。
awk'{print$2}“inputfile | sed's/|/\n/gp'| sort | uniq
请参阅我关于如何防止数据顺序被更改的帖子。@Jotne您的版本打印重复的元素,与OP所需的输出不匹配。请参阅我的编辑,以了解在不打印重复项的情况下保留顺序的方法。OP可能只是忘记了最后一个
好的
。我什么也看不到提到不要打印重复项。@Jotne在输出中有“good”一词,但这只是第一次。我的第二个示例再现了问题中的输出。请注意,问题中也提到了“dedup”ing,即删除重复项。无需使用
END
块,只需按元素的显示方式打印即可(请参见我的编辑)。
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