tcsh에서 파일을 한 줄씩 반복합니다.

tcsh에서 파일을 한 줄씩 반복합니다.

아주 비슷한 질문이네요파일의 줄을 반복하는 방법은 무엇입니까?.

다음 줄이 포함된 파일이 있습니다.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 답변을 따르면 됩니다.

https://stackoverflow.com/questions/40926372/how-to-iterate-every-line-from-variable-on-the-basis-of-new-line-character-inste

답변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

관련 정보