1

このような行でいっぱいのファイルを作成できた場合...

/VAULT14/620100_V14/620054 VOL1620054

最後の2 * 6桁の数字を比較するためにbashを取得するにはどうすればよいですか。たとえば、行の読み取りが次の場合にのみ一致します

/VAULT14/620100_V14/620054 VOL1620541

基本的に、私が持っているのは、tapelabs システム上の仮想テープへのパスのリストであり、同じ行に、そのテープの実際の 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

編集: @shelter からのコメントのおかげで、実際には長さから 1 文字が多すぎるため、/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" }'
4

3 に答える 3

2

純粋な 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 ステートメントを好きなように変更できます。確認のために、同じ/異なる行と完全な行を印刷しました。

于 2013-09-26T15:58:31.140 に答える
2

次のようなものが必要です。

egrep '([0-9]{6}\>).*\1$' <file>
于 2013-09-26T15:44:31.467 に答える