我尝试使用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
然后我可以使用它来匹配哈希表文件。
答案 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
子句用于打印已解析的行。