約 100 人のユーザー用にこのディレクトリ構造があります。
users
- user1
- info.txt
- user2
- info.txt
- user3
- info.txt
...
ファイル内のinfo.txt
内容は次のようになります。
5 some_other_info
基本的に、数字、スペース、テキスト(内部にスペースが含まれる場合があります)を含む 1 行のみです。
result.txt
次のようなファイルを作成したいと思います。
user1 5
user2 6
user3 7
...
ここで、、、、user1
...はディレクトリ名と一致し、数字はそれぞれのファイルの内容と一致します。user2
user3
info.txt
ユーザー ディレクトリの名前にはスペースが含まれていないと想定できます。
これを実行する良い方法は何ですか?
答え1
awk '{split(FILENAME,u,"/"); print u[2], $1}' users/*/info.txt
答え2
簡単なループでこれを実行できますfor
。
{
for userd in users/*/; do
if [[ -e "$userd/info.txt" ]]; then
read num _ < "$userd/info.txt"
printf '%s %s\n' "$user" "$num"
fi
done
} > out.txt
答え3
ステファンの答えのバリエーション:
$ cd users && \
find -mindepth 2 -maxdepth 2 -type f -name info.txt \
| xargs awk '{ split(FILENAME,u,"/"); print u[2], $1 }'
(GNU) を使用するとfind
、xargs
プログラム引数の最大数 (システムによって異なります) を超えるユーザー数から保護されます。
(xargs は入力を正しく分割し、必要に応じて awk を繰り返し呼び出します)
答え4
for f in users/*/info.txt; do
set -- $(< $f)
num=$1
# choose one of:
user=$(basename $(dirname $f))
# or
dir=${f%/*}; user=${dir##*/}
echo $user $num
done