我有一个如下所示的文本文件 -
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"