在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

或(假设 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"

相关内容