我有 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}'