如何將多個文件中的資料聚合到一個文件中?

如何將多個文件中的資料聚合到一個文件中?

我有大約 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

相關內容