Bash 脚本将每行的第一个位置回显到带有第二个名称的文件中

Bash 脚本将每行的第一个位置回显到带有第二个名称的文件中

我有一个文本文件,其组织如下:

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 都与您的脚本位置相关。

相关内容