首页 > 解决方案 > Bash:将带有空格的单行输出拆分为多行,每行一个单词

问题描述

我有一个命令,它输出一个随机排序的单词集。我的目标是最终得到一个排序列表。我正在尝试找到一种可以通过单个命令完成的方法。我知道如果输出在多行上,可以通过管道将其排序到sort,例如

$ echo "foo
> bar
> baz" | sort
bar
baz
foo

那么是否有一个简单的命令可以用来将字符串拆分"foo bar baz"为单独的行,这样我就可以实现我的目标echo "foo bar baz" | magic_string_splitter | sort

编辑:奖金,列表实际上包含一些额外的输出,这将是很好的忽略。例如,我的命令的输出实际上可能是这样的

$ print_words
foo bar baz are your words

但我仍然希望最终结果是

bar
baz
foo

我们可以完全剥离并忽略最后的“是你的话”。

标签: stringbashawk

解决方案


使用 GNU awk:

echo 'foo bar baz are your words' | awk '{NF-=3; OFS="\n"; $1=$1}1' | sort

NF-=3:从当前行中删除最后 3 列。

OFS="\n": 将输出字段分隔符设置为换行符(或使用OFS=ORS)。

$1=$1:强制 awk 用新的 OFS(现在是换行符)重建当前行。

1: awk 计算1为真表达式并输出当前行。

输出:

酒吧
巴兹
富

请参阅:8 个强大的 Awk 内置变量——FS、OFS、RS、ORS、NR、NF、FILENAME、FNR


推荐阅读