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}' +
フィールド区切り文字:
(コロンの後にスペース文字)を使用することは、正しい出力を得るために重要です(先行スペースなし、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}'