我有一个要求,我需要从每行文件中取出前四个字符并对它们进行排序。
我尝试了以下方式。但它没有排序每一行
cut -c1-4 simple_file.txt | sort -n
使用上述O / p:
appl
bana
uoia
预期输出:
alpp
aabn
aiou
答案 0 :(得分:3)
sort
不是作业的正确工具,因为它用于对输入行进行排序,而不是每行中的字符。
我知道您没有使用perl标记问题,但这是您可以采用的一种方式:
perl -F'' -lane 'print(join "", sort @F[0..3])' file
这使用-a
开关自动拆分-F
指定的分隔符上的每一行输入(在本例中为空字符串,因此每个字符都是数组中自己的元素{ {1}})。然后,它使用标准字符串比较顺序对数组的前4个字符进行排序。结果在空字符串上连接在一起。
答案 1 :(得分:2)
尝试定义两个辅助函数:
explodeword () {
test -z "$1" && return
echo ${1:0:1}
explodeword ${1:1}
}
sortword () {
echo $(explodeword $1 | sort) | tr -d ' '
}
然后
cut -c1-4 simple_file.txt | while read -r word; do sortword $word; done
会做你想要的。
答案 2 :(得分:1)
sort
命令用于逐行对文件进行排序,它不是用于对行内容进行排序的。要做出你想做的事情并不是不可能的,但它会有点混乱,可能效率低下。
我可能会在Python中这样做,但是因为可能没有Python,所以这里有一个简短的awk命令可以做你想要的。
awk '{split(substr($0,1,4),a,"");n=asort(a);s="";for(i=1;i<=n;i++)s=s a[i];print s}'
只需在命令行末尾输入要处理的文件名称。
这是我用来测试命令的一些数据:
数据强>
this
is a
simple
test file
a
of
apple
banana
cat
uoiea
bye
这是输出
hist
ais
imps
estt
a
fo
alpp
aabn
act
eiou
bey
这是一个丑陋的Python单线程;作为一个正确的脚本而不是Bash命令行看起来会更好一些:
python -c "import sys;print('\n'.join([''.join(sorted(s[:4])) for s in open(sys.argv[1]).read().splitlines()]))"
与awk版本相比,此命令只能处理单个文件,并将整个文件读入RAM进行处理,而不是逐行处理。