아주 비슷한 질문이네요파일의 줄을 반복하는 방법은 무엇입니까?.
다음 줄이 포함된 파일이 있습니다.N공백으로 구분된 필드입니다. 파일을 한 줄씩 반복하고 필드를 다른 파일의 정보를 호출하는 데 사용할 수 있는 변수로 설정하고 싶습니다.
예를 들어 내 파일은 다음과 같습니다.
A B C
D E F
H I J
K L M
각 행을 반복하고 변수를 필드로 설정하고 싶습니다.
foreach i ( `cat file ` )
set 1st = $i[1]; set 2nd = $i[2]; set 3rd = $i[3]
end
현재 내 쉘은 공백을 사용하여 필드를 구분하므로 각 줄에 3개의 변수를 설정할 수 없습니다.
echo
각각을 살펴보면 $i
다음과 같은 내용이 표시됩니다.
A
B
C
D
....
새 줄만 구분 기호로 사용하여 루프를 제어하는 방법을 알고 싶습니다.
그것이 내가 정말로 달성하고 싶은 것입니다. 3개의 서로 다른 값이 포함된 파일 A의 줄을 grep하고 싶습니다. 이 값은 모두 파일 B의 한 줄에 공백으로 구분된 요소로 나타납니다. 내 계획은 B의 해당 줄에 있는 각 요소(공백으로 구분됨)에 대해 파일 B의 각 줄을 반복한 다음 해당 3개 요소를 사용하는 것입니다. 그런 다음 B의 다음 행에 대해 이 작업을 반복합니다. 하지만 내 루프는 파일 B의 행을 볼 수 없기 때문에 실패합니다. 공백으로 구분된 모든 요소만 볼 수 있으며 3개 요소의 줄로 그룹화되어 있음을 인식할 수 없습니다. 이것이 혼란스럽지 않기를 바랍니다.
답변1
원래 질문이 충분히 명확하게 전달되었는지는 모르겠지만 행에 공백으로 구분된 요소가 있는 쉘 환경에서 텍스트 파일의 행을 반복하는 데 문제가 있는 것 같습니다.
row 1: A B C
row 2: D E F
각 행을 요소로 변환하여 해결 방법을 찾았으며 나중에 이 질문의 범위를 벗어나도록 구문 분석할 수 있습니다. 그래서 위의 두 줄은
row 1: A_B_C
row 2: D_E_F
이 형식에서 내 foreach 루프는 각 행을 단일 요소로 처리합니다. 이제 첫 번째 반복에서 B가 필요한 경우 다음과 같이 사용할 수 있습니다.
foreach i ( `cat <file>` )
foreach? set a = `echo $i | awk -F '_' '{print($2)}'`
foreach? echo $a
foreach? end
다음 내용이 에코되어야 합니다.
B
E
이것은 내 파일의 각 줄에 있는 두 번째 요소가 됩니다.
관심이 있는 분들에게 감사드리며, 더 우아한 방법이 있는지 알려주시기 바랍니다.
답변2
누군가가 이 질문에 답할 수 있기를 바랍니다. 가능합니까? 예. 추천? 아니요. 하지만 꼭 해야 한다면 다음 stackoverflow 답변을 따르면 됩니다.
답변3
csh의 단어 분할 기능은 Bourne 쉘보다 거의 우수합니다. csh에서는 와일드카드 작업 없이 "`cmd`"
출력을 cmd
비어 있지 않은 줄로 분할하지만, `cmd`
와일드카드 작업을 통해 공백, 탭 또는 줄바꿈으로 분할합니다. 그래서 당신은 이것을 할 수 있습니다 :
set n = 0 noglob
foreach line ( "`cat file`" )
@ n++
set field = ( $line )
echo First field of line $n is $field[1], second is $field[2]
end
물론 줄과 필드별로 텍스트를 처리하려면 쉘 루프 대신 perl
또는 비슷한 것을 사용할 수 있습니다.awk