複数のファイルを処理し、拡張子なしでファイル名と特定のキー値を印刷します。

複数のファイルを処理し、拡張子なしでファイル名と特定のキー値を印刷します。

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やループは必要ありませんforfindそしてawkすべてを行うことができます:

find /path/to/folder -name data1.txt -exec awk -F': ' '/^Name/ {print $2}' +

フィールド区切り文字:(コロンの後にスペース文字)を使用することは、正しい出力を得るために重要です(先行スペースなし、2番目のフィールドで1つ以上の単語をサポート)。

出力にファイル名を含めるには、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}'

関連情報