3

sedを使用して括弧内の重複番号を削除しようとしています。

だから私は次の文字列を持っています:

Abdc 1234 1234 (5678) (5678) (9012) (9012) (3456)

sedを使用して、括弧内の4桁の数字(括弧を含む)を削除したいと思います。したがって、私の文字列は次のようになります。

Abdc 1234 1234 (5678) (9012) (3456)

この場合、「(5678)」と「(9012)」は、括弧内に繰り返される4桁の数字であるため、削除されました。「1234」の数字は括弧内にないため削除されませんでした。「(3456)」は繰り返されていなかったため、削除されませんでした。

4

5 に答える 5

5

私はこれを行う方法がわかりませんがsed、次の方法を試すことができますawk

$  echo "Abdc 1234 1234 (5678) (5678) (9012) (9012) (3456)" | awk '
   {
     for(i=1;i<=NF;i++) { 
       if(substr($i,0,1) != "(" || (seen[$i] != 1)) {
         seen[$i]=1;
         printf "%s ",$i
       }
     };
     print ""
   }'

出力:

Abdc 1234 1234 (5678) (9012) (3456) 

これは行フィールドをループし、各フィールドがこれまでに表示されたことがない場合、またはで始まっていない場合にのみ各フィールドを出力し(ます。

于 2012-11-14T00:42:33.610 に答える
2

これはあなたの入力に対して機能します:

echo 'Abdc 1234 1234 (5678) (5678) (9012) (9012) (3456)' | 
  sed 's/\(([0-9][0-9]*)\) \1/\1/g'

重複が互いに続くことを前提としています。そうでない場合は、次のバージョンを使用してください。

echo 'Abdc 1234 1234 (5678) (5678) (9012) (9012) (3456)' | 
  sed 's/\(([0-9][0-9]*)\) \(.*\)\1/\1\2/g'

または、GNUsed拡張式を使用すると少し短くなります。

echo 'Abdc 1234 1234 (5678) (5678) (9012) (9012) (3456)' | 
  sed -r 's/(\([0-9]+\)) (.*)\1/\1\2/g'

すべての場合の出力:

Abdc 1234 1234 (5678) (9012) (3456)

編集-2つ以上の同一アイテムが存在する状況を処理します

これは、パターンが一致しなくなるまでパターンをループすることで実行できます。

echo 'Abdc 1234 1234 (5678) (5678) (9012) (9012) (3456) (5678) (5678)' | 
  sed -r ':a; s/(\([0-9]+\))(.*)\1 ?/\1\2/g; ta'
于 2012-11-14T00:49:24.310 に答える
0

これはあなたのために働くかもしれません(GNU sed):

sed ':a;s/\(\(([0-9]\+) *\).*\)\2/\1/g;ta' file
于 2012-11-14T07:19:01.690 に答える
0

Perlの使用:

$ echo "Abdc 1234 1234 (5678) (5678) (9012) (9012) (3456)" |
    perl -ne '
        my (@arr, %hash);
        for (split) {
            if (/^\(.*\)/) {
                $hash{$_}++;
                push @arr, $_ if $hash{$_} == 1;
            }
            else {
                push @arr, $_; 
            }
        }
        print join " ", @arr, "\n";
    '

これは、入力として複数行で機能し、括弧付きの繰り返しのものがN回出現します。

于 2012-11-14T01:10:28.720 に答える
0
awk -F"(" '{for(i in a)delete a[i];for(i=2;i<=NF;i++){if($i in a){$i="";}else{a[$i];$i="("$i}}print $0}' your_file

以下でテスト済み:入力:

> cat temp
Abdc 1234 1234 (5678) (5678) (9012) (9012) (3456)
1234 1234 (1234) (5678) (9012) (1234) (3456)
 (5678) (6467) (6467) (9012) (5678)

今実行:

> awk -F"(" '{for(i in a)delete a[i];for(i=2;i<=NF;i++){if($i in a){$i="";}else{a[$i];$i="("$i}}print $0}' temp
Abdc 1234 1234  (5678)   (9012)   (3456)
1234 1234  (1234)  (5678)  (9012)   (3456)
  (5678)  (6467)   (9012)  (5678)
> 
于 2012-11-14T07:21:47.687 に答える