使用 bash 对多个文件进行排序

使用 bash 对多个文件进行排序

我有一个涉及 bash 脚本语言的问题。

我有多个目录

  • /studentName
  • /studentMail
  • /studentNumber

每个目录中都有一个文件name.txt,,mail.txtnumber.txt

现在我需要创建一个函数,它的功能与 MySQL 数据库的功能相同SELECT。它不需要读取一行。只需显示这 3 个文件的所有内容并对其进行排序。这意味着我需要类似这样的输出。

studentname | studentmail | studentnumber

我想到了两种方法。

第一的:

cat /studentName/name.txt /studentMail/mail.txt /studentNumber/number.txt > summary
cat summary

这样就会把下面3个文件的全部内容都显示出来了,显然不太好。

我还想到了这个:

paste /studentName/name.txt /studentMail/mail.txt /studentNumber/number.txt

这确实显示了所有内容,但仍然没有真正排序。而且我稍后还需要能够仅选择 1 行进行显示。

有人能帮我做到这一点吗?

附言:我知道sort,但是所有内容都会相互显示在彼此之下,不知为何我做得不对?

答案1

现在文件是如何排序的?比如说,这三个文件的第 3 行是否指的是同一个学生?如果是这样,你可以将解决方案扩展paste为:

paste /studentName/name.txt /studentMail/mail.txt /studentNumber/number.txt | sort

这会按学生姓名对所有记录(行)进行排序。您可以使用适当的选项按其他字段进行排序sort

要选择要显示的单行,请按照任何命令生成正确排序的列表grep,例如,

paste ... | sort | grep 'pattern'

其中 'pattern' 是正则表达式形式的搜索条件。当然,如果您只选择一行,则不需要sort

您可能会发现另一个有用的命令是join,但我对它了解不够多,无法为您提供其用法的示例。

更新:格式化awk

上述命令的输出paste是一系列行,每行由三个字段组成,彼此之间用制表符分隔,即

<字段 1><标签><字段 2><标签><字段 3>

可以通过将这些行放入以下命令中来格式化这些行awk

awk -F '\t' '{printf "%-20s%-16s%s\n", $1, $2, $3}'

参数-F '\t'指定输入字段分隔符是制表符。这会将输入行分成三个字段,即awk$1$2$3awk语言包含一个printf行为基本与 C 库函数相同的函数printf()。上面的格式字符串指定了三个字符串字段。第一个,%-20s,指定相应的字符串参数在 20 个字符的字段中左对齐。第二个,%-16s,指定其参数在 16 个字符的字段中左对齐。最后一个,%s,只是将其参数附加到迄今为止已格式化的内容中。最后,\n在末尾放置一个换行符,以便将每个输入行格式化为单独的输出行。

要根据您的喜好调整输出,只需更改字段宽度和/或删除减号以使字符串右对齐。有关更多选项,请参阅awkprintf手册页。

答案2

如果您要对每个文件进行排序,然后粘贴排序后的数据,使用 bash 您可以使用进程替换:

paste -d '|' <(sort file1) <(sort file2) <(sort file3)

相关内容