4

次のテキストファイルがあり、各行の値、つまり項目2〜4と項目5〜7を比較する必要があります。私はこれでbash/awk/sedで立ち往生しています。

サンプルデータ:

[hartford tmp]$ cat flist
a1 1 2 3 x y z
b1 3 2 1 z y x
c1 1 2 3 1 2 3
d1 4 5 6 6 5 4
e1 a b c a b c
f1 x y z x y z

次のスクリプトで動作しますが、おそらくすべてのが原因で、耐えられないほど遅くなりechoます。

[hartford tmp]$ cat pdelta.sh
#!/bin/bash

cat flist |while read rec; do
    f1="$(echo $rec | awk '{ print $1 }')"
    f2="$(echo $rec | awk '{ print $2 }')"
    f3="$(echo $rec | awk '{ print $3 }')"
    f4="$(echo $rec | awk '{ print $4 }')"
    f5="$(echo $rec | awk '{ print $5 }')"
    f6="$(echo $rec | awk '{ print $6 }')"
    f7="$(echo $rec | awk '{ print $7 }')"

    if [[ "x${f2} x${f3} x${f4}" != "x${f5} x${f6} x${f7}" ]]; then
            echo "$f1 DOES NOT MATCH"
    fi
done

実行すると、出力はまさに私が探しているものですが、5万行以上の長さのファイルを処理する場合は遅すぎます。

[hartford]$ ./pdelta.sh
a1 DOES NOT MATCH
b1 DOES NOT MATCH
d1 DOES NOT MATCH

これを達成するためのより効率的な方法は何ですか?

4

5 に答える 5

6

awk一致するすべてのIDを出力するために使用できます。

awk '{ if ($2 == $5 && $3 == $6 && $4 == $7) { print $1 } }' < flist
于 2012-09-05T10:22:04.033 に答える
5

を使用readして変数を割り当てることができます。

$ while read f1 f2 f3 f4 f5 f6 f7; do stuff; done <flist
于 2012-09-05T10:22:31.480 に答える
4

いくつかの修正:

  1. catパイプに単一のファイルを入れないでください。ループの標準入力をリダイレクトするだけです。
  2. read各行を適切な変数に分割できます。
  3. bash[[...]]構文を使用しているので、空の可能性のある文字列の前に1文字を付けるという古いトリックを使用する必要はありません。対応する値を直接比較するだけです。

したがって、ループは次のようになります。

while read f1 f2 f3 f4 f5 f6 f7; do
    if [[ $f2 != $f5 || $f3 != $f6 || $f4 != $f7 ]]; then
        echo "$f1 DOES NOT MATCH"
    fi
done < flist

配列を使用してさらに減らすこともできます

while read -a f; do
    if [[ ${f[@]:1:3} != ${f[@]:4:3} ]]; then
        echo "${f[0]} DOES NOT MATCH"
    fi
done < flist

${f[@]:x:y}表記は、インデックスで始まる要素に展開されyますx

于 2012-09-05T12:23:22.477 に答える
2

perlの使用:

perl -lane 'print $F[0] if @F[1..3] ne @F[4..6]' input_file
于 2012-09-05T10:24:01.127 に答える
0

Pythonソリューション:

import sys

for line in sys.stdin:
    f1, f2, f3, f4, f5, f6, f7 = line.split()
    if not (f2, f3, f4) == (f5, f6, f7):
        print f1, "does not match"

使用法:

$ python f.py < flist
a1 does not match
b1 does not match
d1 does not match
于 2012-09-05T10:32:28.273 に答える