bash - (bash 脚本)如何对文件中位于 'n' 位置倍数的行进行排序?

标签 bash ubuntu scripting

我必须在 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/

相关文章:

linux - Grep 运行超过 x 分钟的进程计数

javascript - 如何通过浏览器检测某个协议(protocol)是否受支持?

linux - 来自给定输入的空文件夹列表

asp.net - 在 Ubuntu 中运行 ASP.NET 和 VB.Net

eclipse - 正在运行的应用程序(Eclipse)在 Ubuntu Unity 上消失了

powershell - 按顺序运行多个 Powershell 脚本 - 在文件夹上 - 将脚本组合成主脚本

bash - 磁盘使用格式

linux - 尝试计算 BASH 中的圆的半径和面积

linux - 使用 bash 脚本/命令将日志文件组合成 1 个很棒的报告

python - Flask & uwsgi 不渲染静态文件夹中的文件