![处理多个文件并打印不带扩展名的文件名和特定键的值](https://linux22.com/image/88368/%E5%A4%84%E7%90%86%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6%E5%B9%B6%E6%89%93%E5%8D%B0%E4%B8%8D%E5%B8%A6%E6%89%A9%E5%B1%95%E5%90%8D%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D%E5%92%8C%E7%89%B9%E5%AE%9A%E9%94%AE%E7%9A%84%E5%80%BC.png)
我有 ASCII 文件,我想输出该文件中的文件名和特定字段。例如:
ASCII文件“data1.txt”的内容如下:
Name: John
Age: 90
Gender: Male
Date: 20160105
我有一个很长的文件夹列表。在每个文件夹中我都有该文件data1.txt
。这些文件的设计与我之前展示的相同,但内容不同。
在父文件夹中,我创建了包含文件夹列表的文本文件,并将其命名为all.txt
.然后我编写了以下 bash 脚本:
#!/bin/bash
PAT=PATH TO THE PARENT FOLDER
for i in $(cat $PAT/all.txt); do
sed -n '/Name:/p' $PAT/$i/data1.txt | awk '{ print $2}'
如何修改之前的代码以打印以下内容:
data1: John
答案1
您不需要该all.txt
文件、sed
或for
循环。 find
并且awk
可以做到这一切:
find /path/to/folder -name data1.txt -exec awk -F': ' '/^Name/ {print $2}' +
使用字段分隔符:
(冒号后跟空格字符)是获得正确输出的关键(无前导空格,支持第二个字段中的一个或多个单词)
如果您希望输出中包含文件名,请将 awk 脚本更改为如下所示:
find ... -exec awk -F': ' '/^Name/ {print FILENAME": "$2}' +
答案2
我执行了以下操作并且代码完美运行:
#!/bin/bash
PAT=PATH TO THE PARENT FOLDER
for i in $(cat $PAT/all.txt); do
echo -n "data1"
sed -n '/Name:/p' $PAT/$i/data1.txt | awk '{ print $2}'