我必须在 ubuntu linux 中用 bash 语言编写一个脚本,它必须在命令行中接受三个参数:首先是我必须对其行进行排序的文件的名称,其次是一个字母(如果我想按字母顺序排序,则为“a”升序或'z',如果我想按字母降序排序)和第三个正数'n'。我只需要对“n”的倍数的行进行排序。例如,如果我有一个包含 100 行且 n=5 的文本文件,那么我只需对第 5、10、15、...、100 行进行排序,其余的必须保持不变。这可以做到吗?
我可以像这样找到并排序“n”倍数的行:
awk "NR%$n==0" archivo.txt | sort -f
但现在我不知道如何将这些行再次写入文件。
感谢关注
最佳答案
如果您不介意将整个输入文件放入内存中,则可以使用 gawk,以便可以在打印之前对行子集进行排序。
#!/usr/bin/env gawk -f
BEGIN {
if (!inc) inc=5 # set a default
}
NR%inc {
# This is a normal line
nosort[NR]=$0
next
}
{
# This is an increment of "inc"
tosort[NR]=$0
}
END {
# Sort the array of increments
asort(tosort)
# Step through our two arrays, picking what to print based on the modulo
n=0
for (i=1; i<NR; i++)
if (i%inc==0)
print tosort[++n]
else
print nosort[i]
}
您可以使用以下方式运行它:
$ ./sortthing -v inc=5 inputfile
请注意,这使用了 gawk 函数
asort()
,在 One True awk 中不存在。因此,如果您在 *BSD 或 OS X 上执行此操作,您可能需要安装其他工具。
关于bash - (bash 脚本)如何对文件中位于 'n' 位置倍数的行进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42320048/