-4

我有一个5000行的文本文件,每五行可以分组。在该组的五行中,我想替换每组第二行第 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

这是你想要完成的吗?

#!/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 回答
1

你可以分配给$12来改变它。

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

感谢@EdMorton 的BEGIN块修复。

于 2013-01-04T11:14:08.603 回答