약 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
Stephen의 답변에 대한 변형:
$ cd users && \
find -mindepth 2 -maxdepth 2 -type f -name info.txt \
| xargs awk '{ split(FILENAME,u,"/"); print u[2], $1 }'
find
(GNU)는 사용자 수가 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