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"`)

問題は、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何らかの理由で行の末尾にないファイルがあり、それを保持したい場合でもファイルから削除してください。

おすすめ記事