我有一个命令,它输出一个随机排列的单词集。我的目标是最终获得排序列表。我正在尝试找到一种方法,可以通过一个命令来完成。我知道,如果输出在多行中,则可以通过将其输送到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
我们可以完全剥离并忽略最后的“是你的话”。
答案 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
将它们排列在单独的行中。