-4

5000行のテキストファイルがあり、5行ごとにグループ化できます。その5行のグループで、各グループの2行目の12列目の文字列を置き換えたいと思います。これを実現するには、ファイル全体をawkの配列に読み込む必要がありますが、それができませんでした。誰か助けてくれませんか。

abc acd ade aef afg agh ahi aij ajk akl alm amn ano apq ars atu auv awx ayz
**abc acd ade aef afg agh ahi aij ajk akl alm *amn* ano apq ars atu auv awx ayz**
abc acd ade aef afg agh ahi aij ajk akl alm amn ano apq ars atu auv awx ayz
abc acd ade aef afg agh ahi aij ajk akl alm amn ano apq ars atu auv awx ayz
abc acd ade aef afg agh ahi aij ajk akl alm amn ano apq ars atu auv awx ayz
bcd bef bfg bhi bjk blm bno bpq brs btu bvw bxy bza bab bbc bdc bde bfg bhj
**bcd bef bfg bhi bjk blm bno bpq brs btu bvw *bxy* bza bab bbc bdc bde bfg bhj**
bcd bef bfg bhi bjk blm bno bpq brs btu bvw bxy bza bab bbc bdc bde bfg bhj
bcd bef bfg bhi bjk blm bno bpq brs btu bvw bxy bza bab bbc bdc bde bfg bhj
bcd bef bfg bhi bjk blm bno bpq brs btu bvw bxy bza bab bbc bdc bde bfg bhj
.....
.....
.....

BEGIN {
    FS="\t"
}

NR==FNR {
    a[FNR]=$0
    next
}
4

2 に答える 2

1

に割り当てるだけ$12で変更できます。

awk 'BEGIN { FS=OFS="\t" }'
  NR % 5 == 2 { $12 = "ick" }1' inputfile >outputfile

BEGINブロックを修正してくれた @EdMorton に感謝します。

于 2013-01-04T11:14:08.603 に答える
1

これはあなたが達成しようとしていることですか?

#!/usr/bin/awk -f

BEGIN{
    FS="\t"
}

{
  if( NR % 5 == 2 ){ # 2nd line in each group
     for( i = 1 ; i <= NF ; i ++ ){ 
        # replace 12th column by a string, 
        # simply print everything else
        if( i == 12 ){
           printf "replacement" FS
        } else {
           printf $i FS
        }
        printf "\n"
     }
  } else {  # simply print all other lines in each group
     print
  }
}

これは、ファイル全体を配列に読み込むよりも優れていると思いますが、これは awk でそのようなことを行う方法ではありません。

ただし、何らかの理由でファイル全体を配列に読み込みたい場合は、これが解決策になります。

#!/usr/bin/awk -f

BEGIN{
    FS="\t"
}

{
    for( i = 1 ; i <= NF ; i ++ ){
        a[NR,i] = $i
    }
}

END{
    for( i = 2 ; i <= NR ; i = i+5 ){
        a[i,12] = "replacement"
    }
    for( i = 1 ; i <= NR ; i++ ){
        j=1
        while( a[i,j] ){
            printf a[i,j] FS
            j ++
        }
        printf "\n"
    }
}
于 2013-01-04T10:01:40.623 に答える