2013-01-04 74 views
-5

我有一個包含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 
} 
+0

取代什麼?你到現在爲止嘗試過什麼? – Vijay

+0

如果你正在學習awk,忽略這個註釋,但考慮到問題的大小,在任何其他程序中都應該很容易。說Excel。 –

+0

分組如何?你想將每行寫入數組嗎? 'awk'/./{arr[i++] = $ 0}''或者您是否想將每個五個組寫入一個條目? – emil

回答

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" 
    } 
} 
+0

謝謝,但此代碼替換文件中的所有列。 – Kaartz

+0

可能是因爲您似乎正在使用的製表符分隔符。我相應地修改了代碼,看看我的編輯。這兩個版本都適用於您提供的示例輸入。 – JTextor

+0

非常感謝。有效! – Kaartz

1

您可以直接分配給$12去改變它。

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

感謝@EdMorton對BEGIN塊修復。