2014-12-09 5 views
3

내 awk 명령 목록이 데이터 파일의 첫 번째 행을 읽지 못하게 만드는 데 문제가 있습니다. 첫 번째 줄을 제외한 각 줄을 읽은 다음 운동 선수와 연을 문자열로 연결해야합니다. 나중에 배열을 사용하는 프로그램에서 모든 코드를 나열하지 않았습니다. 데이터 파일의 처음 두 행은 다음과 같습니다. 제목을 읽지 않고 첫 번째 운동 선수 만 시작하도록 만들어야합니다. 이것에 대한 도움이 될 것입니다!awk 명령 파일의 첫 번째 파일 행을 읽지 않습니다.

스크립트 :

BEGIN{ 
FS="," 
cnt=0; sum=0; 
} 
{ 
name=$1 
year=$4 
ayStr = name "," " " year 

답변

3

파일 라인 처리 블록 전에 사용 NR > 1 :

BEGIN { 
FS="," 
cnt=0; sum=0; 
} 
NR > 1 { 
name=$1 
year=$4 
ayStr = name "," " " year 

NR이 파일의 행 번호를, 그래서 그것은 단지 1

+0

나는 awk 명령 파일을 호출 할 때 첫 번째 줄이없는 파일의 내용을 인쇄 한 다음 내 END 블록에있는 내용을 인쇄합니다. 또한 END 블록에 내 배열을 인쇄 할 때 첫 번째 행은 여전히 ​​포함되어 있습니다. 파일의 내용이 아니라 출력 만 인쇄하면됩니다. – XpLoiTs

+0

@XpLoiTs 현재 설명하고있는 문제는 스크립트에 표시되지 않았거나 알려주지 않은 부분에 존재하므로 문제를 해결할 수 없습니다. –

+0

하지만 당신은 @Barmar가 제안한 것을하지 않았습니다. 물론 당신은 여전히 ​​문제가 있습니다. 줄의 시작 부분에 다른 양의 공백을 사용하여 코드를 들여 쓰기하면 읽기가 더 쉬워집니다. –

1
후 라인을 처리

@Barmar에 따르면 NR>1을 테스트하여 첫 번째 줄을 건너 뛸 수 있지만 사용하면 건너 뛸 수있는 이유는 무엇입니까? 대신이 작업을 수행하고 당신은 단지 그들이 첫 번째 줄에있는 값에 액세스, 스크립트에 하드 코드에 필드 번호가 필요하지 않습니다 :

$ cat tst.awk 
BEGIN{ FS="," } 

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

{ 
    ayStr = $(f["Athlete"]) ", " $(f["Year"]) 
    print ayStr 

    print "----" 

    for (name in f) { 
     value = $(f[name]) 
     print name " = " value 
    } 
} 

합니다.

$ awk -f tst.awk file 
Yannick Agnel, 2012 
---- 
Silver Medals = 1 
Total Medals = 3 
Athlete = Yannick Agnel 
Gold Medals = 2 
Closing Ceremony Date = 8/12/2012 
Year = 2012 
Age = 20 
Bronze Medals = 0 
Sport = Swimming 
Country = France 
+0

for 루프를 올바른 순서로 수행하는 것이 좋지 않겠습니까? –

+0

현재 루프는 어떤 필드가 존재하는지 OP를 보여주기위한 것입니다. OP는 모든 필드에서 루프를 수행 할 필요는 없지만 나머지 코드에서는 특정 이름의 필드 만 사용하는 것으로 생각됩니다. –

관련 문제