awk:将行中的分隔文本列拆分为行
我有一个有五列的文件,第二列有分隔文本。我想分割分隔文本,消除重复并打印成行。我可以用下面的命令来做。我想做一个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 -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