如果我能创建一个像这样的文件.
/VAULT14/620100_V14/620054 VOL1620054
我怎样才能得到bash来比较最后的2*6位数字,例如,只有在行读时才匹配,例如
/VAULT14/620100_V14/620054 VOL1620541
本质上,我所拥有的是到磁带系统上的虚拟磁带的路径列表,在同一行中,该磁带的实际VOL1磁带头标签是什么。
我关心的是标签(VOL1)是否与实际的虚拟磁带文件名不匹配。
我确实尝试过使用awk,但肯定遗漏了一些东西:
echo "/VAULT14/620100_V14/620054 VOL1620054" | awk '{ if (substr($1,(length($1)-6)) == substr($2,(length($2)-6))) print "Same"; else print "Different" }'当我认为应该返回Different时返回Same
编辑:由于@的评论,我意识到我实际上从长度上取了一个太多的字符,所以/620054永远也比不上1620054!
更新后的代码是:
echo "/VAULT14/620100_V14/620054 VOL1620054" | awk '{ if (substr($1,(length($1)-5)) == substr($2,(length($2)-5))) print "Same"; else print "Different" }'发布于 2013-09-26 15:44:31
你想要这样的东西:
egrep '([0-9]{6}\>).*\1$' <file>发布于 2013-09-26 16:07:25
使用perl兼容的正则表达式\d{6}\b在单词(或字符串末尾)的末尾查找6位数字。
while read line; do
set -- $(grep -oP '\d{6}\b' <<< "$line")
if (( $1 == $2 )); then
echo "same -- $line"
else
echo "diff -- $line"
fi
done << END
/VAULT14/620100_V14/620054 VOL1620054
/VAULT14/620100_V14/620054 VOL1620541
ENDsame -- /VAULT14/620100_V14/620054 VOL1620054
diff -- /VAULT14/620100_V14/620054 VOL1620541发布于 2013-09-26 15:58:31
纯bash溶液:
#!/bin/bash
while read line; do
if [[ $line =~ /([0-9]{6})[\ \t]+VOL[0-9]*([0-9]{6}) ]] && \
[[ ${BASH_REMATCH[1]} = ${BASH_REMATCH[2]} ]]; then
echo same:$line
else
echo different:$line
fi
done保存为例如,2match,然后chmod +x 2match,然后运行:
$ cat vault.txt
/VAULT14/620100_V14/620054 VOL1620054
/VAULT14/620100_V14/620054 VOL1620541
$ ./2match < vault.txt
same:/VAULT14/620100_V14/620054 VOL1620054
different:/VAULT14/620100_V14/620054 VOL1620541
$ 正则表达式可能比需要的要复杂一些--我不确定输入行的格式有多大的灵活性。
显然,您可以将echo语句更改为您想要的任何内容--我只是打印出了相同的/不同的以及用于检查的整行内容。
https://stackoverflow.com/questions/19031177
复制相似问题