我有大約 100 個使用者的目錄結構。
users
- user1
- info.txt
- user2
- info.txt
- user3
- info.txt
...
在文件內部info.txt
,內容如下所示。
5 some_other_info
基本上,它只是一行,包含一個數字、一個空格,然後是一些文字(其中可能有空格)。
我想創建一個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