아래와 같은 텍스트 파일이 있습니다.
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"