我有一个涉及 bash 脚本语言的问题。
我有多个目录
/studentName
/studentMail
/studentNumber
每个目录中都有一个文件name.txt
,,mail.txt
。number.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
。$3
该awk
语言包含一个printf
行为基本与 C 库函数相同的函数printf()
。上面的格式字符串指定了三个字符串字段。第一个,%-20s
,指定相应的字符串参数在 20 个字符的字段中左对齐。第二个,%-16s
,指定其参数在 16 个字符的字段中左对齐。最后一个,%s
,只是将其参数附加到迄今为止已格式化的内容中。最后,\n
在末尾放置一个换行符,以便将每个输入行格式化为单独的输出行。
要根据您的喜好调整输出,只需更改字段宽度和/或删除减号以使字符串右对齐。有关更多选项,请参阅awk
和printf
手册页。
答案2
如果您要对每个文件进行排序,然后粘贴排序后的数据,使用 bash 您可以使用进程替换:
paste -d '|' <(sort file1) <(sort file2) <(sort file3)