我有一个文本文件,其组织如下:
Group 1
asdsdsdsdf.html jeff
xcvxcvxcvx.html bob
vrgeiuvhif.html sue
Group 2
iwdowijdoi.html mary
pokpompojm.html doug
ndkjfsjfbs.html lisa
我需要一个bash
脚本来创建一个以每个组命名的目录。然后是一个文本文件,为该组中的每个人命名,并在第一行显示相应的链接。
我已经成功地创建了目录、命名文本文件和仅包含链接的文件。但我不知道如何将每个链接回显到每个名称文件中,也不知道如何按组对它们进行排序。
我确信有更好的方法来完成我所拥有的少量资金。
#!/bin/bash
grep Group list.txt > groups
grep -v Group list.txt > links_names
while read file; do mkdir "${file}"; done < groups
while read line; do export name=`echo $line | awk '{print $2}'`
touch "$name"; done < links_names
while read line; do export link=`echo $line | awk '{print $1}'`
echo "$link" >> links ; done < links_names
rm {groups,links_names,links}
答案1
和awk
:
awk '/^Group/{g=$0; system("mkdir \""g"\""); next} g&&$0{print $1 >g"/"$2}' file
/^Group/
如果该行以字符串开头Group
...g=$0
将变量设置g
为组名称,例如Group 1
。system(...)
使用系统函数调用命令mkdir
来创建该目录(请注意处理组名称中的空格的附加引号)。
g&&$0
如果定义了变量g
并且该行不为空...print $1 >g"/"$2
通过第二个字段(名称)的值将第一个字段(链接)中的值写入$1
目录名称中的文件。g
$2
考试:
$ cat Group\ 2/doug
pokpompojm.html
答案2
要求
我需要一个 bash 脚本来创建一个以每个组命名的目录。然后是一个文本文件,为该组中的每个人命名,并在第一行显示相应的链接。
#!/bin/bash
while read a b
do
# Skip blank lines
test -z "$a" && continue
if [[ "$a" == "Group" ]]
then
# Create the group directory
group_dir="$a $b"
mkdir "$group_dir"
else
# Write the link into the named file
echo "$a" > "$group_dir/$b"
fi
done <list.txt
对于纯粹主义者来说,这存在一些限制:
- 文本文件中没有任何行以重要的空格开头
- 没有链接包含空格
- 每行要么恰好有两个由空格分隔的单词,要么行为空
- 第一个非空行是组标题
所有这些假设都可以以额外的代码(和复杂性)为代价来克服。
答案3
如果您的文本文件很严格,因为在您的组中将始终被称为“组”,后跟一个空格和一个单词,并且组名称中不会有任何空格,并且对于 .html 之后的名称类似,这应该有效。
#!/bin/bash
parseNdostuff(){
case $1 in
Group)
shift
mkdir $1
cd $1
;;
*.html)
link=$1
shift
echo $link > $1
;;
*)
cd ..
;;
esac
}
while read line
do
parseNdostuff $line
done < mytext.txt
只需while read line
在最后输入您的文本文件< mytext.txt
,然后将其提供给我编写的函数即可。我选择在函数中执行此操作的原因是为了简化处理每一行,并且能够轻松使用 case 和 shift。
一些细节:
$1
是函数的第一个参数($
变量很特殊,查一下)
shift
下推参数($1
被丢弃,$2
变成$1
, $3
-> $2
)
当它创建一个目录时,它会cd
进入该目录,因此当该语句再次运行并看到 .html 行时,它会创建文件并将链接全部输入到正确的目录中。
*)
是所有其他情况,所以如果组之间有一个空行,它只会cd ..
进入一个目录,然后您将回到开始脚本的位置。请注意,所有这些 cd 都与您的脚本位置相关。