重击:将一行输出(带空格)分成多行,每行一个单词

时间:2019-07-15 18:42:49

标签: string bash awk

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

)进行排序
$ echo "foo
> bar
> baz" | sort
bar
baz
foo

有没有一个简单的命令可以将"foo bar baz"之类的字符串拆分为单独的行,因此我可以使用echo "foo bar baz" | magic_string_splitter | sort来实现目标

edit:奖励,该列表实际上包含一些额外的输出,这些输出将很容易被忽略。例如,我的命令输出实际上可能是这样的

$ print_words
foo bar baz are your words

但是我仍然希望最终结果是

bar
baz
foo

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

3 个答案:

答案 0 :(得分:3)

使用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评估为真表达式并输出当前行。

输出:

bar
baz
foo

请参阅:8 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

答案 1 :(得分:1)

您可以使用 customValidator() { return (form:FormGroup)=>{ const errors=[]; if (!form.value.compare) { if (!form.value.name1) errors.push('name1') if (!form.value.date1) errors.push('date1') } else { ....other logic... } form.get('name1').setErrors(errors.find(x=>x=='name1')?{error:"required"}:null) form.get('date1').setErrors(errors.find(x=>x=='date1')?{error:"required"}:null) form.get('name2').setErrors(errors.find(x=>x=='name2')?{error:"required"}:null) form.get('date2').setErrors(errors.find(x=>x=='date2')?{error:"required"}:null) return null } } 和(GNU)tr

head
  • $ echo "foo bar baz are your words" | tr -s '[:blank:]' '\n' | head -n -3 | sort bar baz foo 压缩所有空格,并用一个换行符替换它们
  • tr -s '[:blank:]' '\n'删除最后三行

答案 2 :(得分:0)

echo "foo bar   baz more" |tr -s ' ' | cut -d ' ' -f 1-3 | fmt -w 1

cut选择前三个字段,fmt将它们排列在单独的行中。