2013-01-04 2 views
-5

나는 5000의 선을 가진 원본 파일이 있고, 5 개의 선은 분류 될 수있다. 그 다섯 줄의 그룹에서 나는 각 그룹의 두 번째 줄에있는 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}' '또는 5 개의 각 그룹을 항목으로 쓰고 싶습니까? – 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 

BEGIN 블록 수정에 대한 @EdMorton에게 감사드립니다.

관련 문제