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

答え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"

関連情報