열의 내용을 기반으로 새 디렉터리/폴더를 만듭니다.

열의 내용을 기반으로 새 디렉터리/폴더를 만듭니다.

아래와 같은 데이터가 포함된 폴더를 만들어야 합니다.

폴더 이름은 열 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디렉터리가 이미 존재하는 경우 실패하지 않도록 " " 플래그가 여전히 필요합니다.mkdirmkdir

답변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

예를 들어, 매번 동일한 파일이 "생성"된다는 것을 감지하지 못합니다.

관련 정보