아래와 같은 데이터가 포함된 폴더를 만들어야 합니다.
폴더 이름은 열 1을 기준으로 고유하게 지정되어야 합니다. 각 폴더 A, B, C, D의 내용은 2열의 해당 값이어야 합니다.
또한 각 폴더의 총 항목 수를 원합니다.
예를 들어. "B"라는 폴더에는 폴더 "B"의 마지막 행의 총 개수인 "3"이라는 고유한 행 번호로 "B, B1 및 B2"가 있어야 합니다.
데이터는 다음과 같습니다.
col1 col2
A A
B B
B B1
B B2
C C1
C C2
C C3
D D1
D D2
답변1
"폴더의 내용"이 무슨 뜻인지 잘 모르겠습니다. 이 내용이 디렉토리입니까, 아니면 일종의 파일입니까? 디렉터리를 쉽게 만들 수 있는 경우:
< /tmp/input.txt xargs -n2 bash -c 'mkdir -p $0/$1'
이는 /tmp/input.txt
입력 파일(예제에서는)에서 한 번에 두 개의 인수를 간단한 bash 스크립트로 보내는 것을 의미합니다 mkdir -p $0/$1
. 여기서 는 첫 번째 매개변수( )가 맨 위에 있고 두 번째 매개변수가 첫 번째 매개변수( ) 아래에 mkdir -p
있는 디렉터리를 반복적으로 생성하는 것을 의미합니다 .$0
$1
디렉터리 대신 파일을 생성하려면 다음과 같이 변경할 수 있습니다.
< /tmp/input.txt xargs -n2 bash -c 'mkdir -p $0;touch $0/$1'
echo
다음 명령을 삽입하여 진행 상황을 확인할 수 있습니다.
< /tmp/input.txt xargs -n2 bash -c 'echo mkdir -p $0;echo touch $0/$1'
mkdir -p A
touch A/A
mkdir -p B
touch B/B
mkdir -p B
touch B/B1
mkdir -p B
touch B/B2
...
-p
디렉터리가 이미 존재하는 경우 실패하지 않도록 " " 플래그가 여전히 필요합니다.mkdir
mkdir
답변2
먼저 조건에 맞는 테이블을 그립니다. 즉, 각 행의 첫 번째 항목은 파일 이름이고 나머지 행은 내용입니다. 이는 awk 명령을 사용하여 쉽게 수행할 수 있습니다.
$ awk '{a[$1]=a[$1]" "$2} END {for (i in a) print i, a[i]}' q763074 | awk '{print $0, NF-1}'
A A 1
B B B1 B2 3
C C1 C2 C3 3
D D1 D2 2
(q763074는 입력 예입니다)
이제 해당 출력을 이 루프에 파이프하면 완료됩니다.
while read -r line; do
#first item is the file name
filename=$(echo $line | awk '{print $1}')
#the rest is file contents
content=$(echo $line | cut -d ' ' -f 2-)
# create file and and write each item to a new line
echo "$content" | tr ' ' '\n' > "$filename.txt"
done
답변3
이것이 zsh가 포함된 간단한 tsv 파일이라고 가정합니다.
#! /bin/zsh -
table=/path/to/your/file.tsv
typeset -A seen failed entries
ret=0
warn() {
print -rC1 -u2 -- "$@"
ret=1
}
{
read -r header_ignored
while IFS=$'\t\t' read -r dir file rest_ignored; do
# sanity checks
if [[ $dir = /* ]]; then
warn "skipping $dir absolute path"
elif [[ -z $dir ]]; then
warn "skipping empty dir"
elif [[ /$dir/ = */../* ]]; then
warn "skipping $dir with .. path components"
elif [[ /$file/ = */../* ]]; then
warn "skipping $file with .. path components"
else
file=${dir%/}/$file
if
[[ $file:h != . ]] &&
(( ! seen[\$file:h]++ )) &&
! mkdir -p -- $file:h
then
(( fail[\$file:h]++ ))
warn
continue
fi
if (( ! fail[\$file:h] )); then
if true >> $file; then
(( entries[\$dir]++ ))
else
warn
fi
fi
done
for k v in "${(@kv)entries}"; do
print -r -- $v entries were successfully created in $k
done
exit $ret
} < "$table"
(테스트되지 않음)
다음 사항에 유의하세요.
col1 col2
some/dir subdir/file
./some/dir subdir/file
some dir/subdir/file
some/dir/subdir file
. some/dir/subdir/file
예를 들어, 매번 동일한 파일이 "생성"된다는 것을 감지하지 못합니다.