csh에서 텍스트 파일을 배열로 읽는 중에 문제가 발생했습니다.

csh에서 텍스트 파일을 배열로 읽는 중에 문제가 발생했습니다.

아래와 같은 텍스트 파일이 있습니다.

1 29 12
1 22 17
1 20 43
1 48 30
1 3 0
1 21 25
1 18 9
1 14 1
1 44 45
1 52 26
1 NaN 27
1 13 46
1 5 37
1 34 23
1 39 40

해당 열을 다른 배열 변수에 저장하고 싶습니다. 나는 다음 명령을 사용했습니다 -

#!/bin/csh
set Logfile=$proj_path/data/individual/AAR"$subj"/activation/trialWise/"AAR"$subj"_PseudoOrder.txt"

set acc_full= (`awk -F' ' '{print $1}' "$Logfile"`)

set stim1= (`awk -F' ' '{print $2}' "$Logfile"`)

set stim2= (`awk -F' ' '{print $3}' "$Logfile"`)

문제는 세 번째 awk 명령이 세 번째 열의 마지막 숫자만 저장한다는 것입니다.

답변1

파일에 Windows 줄 끝이 있습니다. 이전에 Windows 컴퓨터에서 편집한 적이 있어야 합니다. 즉, 후행 \r문자는 변수의 일부이므로 csh변수 값을 인쇄하면 \r이전 값을 덮어쓰게 됩니다.

$ printf 'a\rb\rc\re\r\n'
e
$ printf 'a\rb\rc\re\r\n' | od -c
0000000   a  \r   b  \r   c  \r   e  \r  \n
0000011

다음 명령 중 하나를 사용하여 파일을 복구할 수 있으며, 그 후에는 스크립트가 작동합니다(물론 스크립트 언어로 사용할지 여부를 실제로 고려해야 합니다 csh:이는 스크립팅에 있어 매우 나쁜 선택입니다.):

dos2unix foo_PseudoOrder.txt

또는 (GNU sed또는 호환 가능하다고 가정)

sed -i 's/\r$//' foo_PseudoOrder.txt

또는

tr -d '\r' < foo_PseudoOrder.txt > tmpFile && mv tmpFile foo_PseudoOrder.txt

위의 해결 방법 은 tr제거됩니다.모두 \r어떤 이유로든 줄 끝에 없는 파일이 있고 이를 유지하려는 경우에도 파일에서 제거하십시오.

답변2

DOS 줄 끝이 있습니다. 참조내 도구 출력이 자체적으로 덮어쓰이는 이유와 해결 방법.

스크립트의 s -F ' '는 FS를 기본적으로 이미 가지고 있는 값으로 설정하므로 유용한 작업을 수행하지 않으므로 그렇게 하지 마세요.

GNU awk(다중 문자 RS용)가 있는 경우 다음을 변경합니다.

awk '{print $3}' "$Logfile"

이와 관련하여:

awk -v RS='\r\n' '{print $3}' "$Logfile"

또는 awk를 사용하십시오.

awk '{sub(/\r$/,""); print $3}' "$Logfile"

관련 정보