根据列的内容创建新目录/文件夹

根据列的内容创建新目录/文件夹

我需要创建包含如下数据的文件夹。

该文件夹应根据第 1 列进行唯一命名,例如。 A、B、C、D 每个文件夹的内容应为第 2 列中对应的值

另外我还想要每个文件夹中的条目总数

例如。名为“B”的文件夹应将“B、B1 和 B2”作为不同的行数“3”作为文件夹“B”中最后一行的总数

数据看起来像:

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

假设这是一个简单的 tsv 文件,带有 zsh:

#! /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

例如,它不会检测到每次“创建”的是同一个文件。

相关内容