将整个文件读入数组

时间:2013-01-04 09:28:54

标签: arrays awk

我有一个包含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
}

2 个答案:

答案 0 :(得分: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"
    }
}

答案 1 :(得分:1)

您只需指定$12即可进行更改。

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

感谢@EdMorton进行BEGIN块修复。