약 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
Stephane의 답변에 대한 변형:
$ 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