以下のテキストファイルがあります。
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"`)
問題は、3番目のawkコマンドが3番目の列の最後の数字だけを保存することです。
答え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
または(GNUsed
または互換性があると仮定)
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"