使用getops bash脚本拆分脚本

时间:2017-04-06 13:00:06

标签: bash

我尝试使用getops选项拆分代码,基本上我想要设置1个选项时运行1个脚本,如果设置了其他选项则运行另一个脚本,请参阅代码:

#!/bin/bash

# A POSIX variable
OPTIND=1         # Reset in case getopts has been used previously in the shell.

# Initialize our own variables:
1=""
2=""
verbose=0


while getopts "h?v:f:m:l:" opt; do
    case "$opt" in
    h|\?)
        exit 0
        ;;
    v)  verbose=1
        ;;
    f)  1=$OPTARG
        ;;
    m)  2=$OPTARG
        ;;
    esac
done

for file in $1;
do
        1="$(sed '1d' $1 | awk -F \" '{print $2}')"
        printf "$1\n"
done <"$1"

for file in $2;
do
        2="$(awk '{print $1}' $2 | sort | uniq)"
        printf "$2\n"
done <"$2"  

所以在我的代码中,如果选项-f设置了一个文件,那么我就会以&#34;开头的for循环为$ 1&#34;会跑。如果-m设置了一个文件,我就会以&#34;开头的循环为$ 2&#34;会跑。

我也想这样做只有-m或-f可以运行,即不能同时运行。

命令行用法是:./ script.sh -f file.txt或./script.sh -m file.txt

我该如何设置? (接受除了getops之外的其他选项)

-f:

的示例文件
<blank line>
"b2f5ff47436671b6e533d8dc3614845d","54fd1711209fb1c0781092374132c66e79e2241b","path/path","output"
"8fa14cdd754f91cc6554c9e71929cce7","4a0a19218e082a343a1b17e5333409af9d98f0f5","path/path2","output2"
"2510c39011c5be704182423e3a695e91","27d5482eebd075de44389774fce28c69f45c8a75","path/path3","output3"
...

-m:

的示例文件
b2f5ff47436671b6e533d8dc3614845d /paths/path
2510c39011c5be704182423e3a695e91 /paths/path2

我使用awk取出-f和-m文件的第一个字段。 sed命令在删除第一个字段之前删除文件的第一行(\ n)。

预期产出:

b2f5ff47436671b6e533d8dc3614845d
8fa14cdd754f91cc6554c9e71929cce7
2510c39011c5be704182423e3a695e91
b2f5ff47436671b6e533d8dc3614845d
2510c39011c5be704182423e3a695e91

然后我可以使用它来匹配哈希表文件。

1 个答案:

答案 0 :(得分:1)

假设这两个文件的内容如下,

cat file1

"b2f5ff47436671b6e533d8dc3614845d","54fd1711209fb1c0781092374132c66e79e2241b","path/path","output"
"8fa14cdd754f91cc6554c9e71929cce7","4a0a19218e082a343a1b17e5333409af9d98f0f5","path/path2","output2"
"2510c39011c5be704182423e3a695e91","27d5482eebd075de44389774fce28c69f45c8a75","path/path3","output3"

,另一个文件是,

cat file2
b2f5ff47436671b6e533d8dc3614845d /paths/path
2510c39011c5be704182423e3a695e91 /paths/path2

您可以使用单个Awk作为

awk 'FNR==NR && NF{gsub(/"/,"",$1); uniqueString[NR]=$1; next}{uniqueString[NR]=$1; next}END{for (i in uniqueString) print uniqueString[i]}' FS="," file1 FS=" " file2

给出了

b2f5ff47436671b6e533d8dc3614845d
8fa14cdd754f91cc6554c9e71929cce7
2510c39011c5be704182423e3a695e91
b2f5ff47436671b6e533d8dc3614845d
2510c39011c5be704182423e3a695e91

awk的核心逻辑是uniqueString创建数组NR索引; awk中的一个特殊变量,用于跟踪文件中每行处理的行号

FNR==NR将存储$ 1中条目的第一个文件解析为哈希映射。由于值包含双引号,因此会使用gsub()删除它,而字段FS则由字段,完成。

file1中解析所有行后,在第二个文件{..}上执行以下file2部分,再次在数组中存储$1的条目,但是现在将字段分隔符设置为空格。

处理完所有行后,END子句用于打印已解析的行。