我需要创建包含如下数据的文件夹。
该文件夹应根据第 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
”标志,以便在目录已存在时不会失败。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
假设这是一个简单的 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
例如,它不会检测到每次“创建”的是同一个文件。