获得前N个字符并对它们进行排序

时间:2015-09-07 13:03:25

标签: bash shell sorting cut

我有一个要求,我需要从每行文件中取出前四个字符并对它们进行排序。

我尝试了以下方式。但它没有排序每一行

cut -c1-4 simple_file.txt | sort -n

使用上述O / p:

appl
bana
uoia

预期输出:

alpp
aabn
aiou

3 个答案:

答案 0 :(得分:3)

在这种情况下,

sort不是作业的正确工具,因为它用于对输入行进行排序,而不是每行中的字符。

我知道您没有使用标记问题,但这是您可以采用的一种方式:

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进行处理,而不是逐行处理。