R 跳过/dev/stdin 中的行

标签 r terminal

我有一个包含数字列表的文件(自己制作: for x in $(seq 10000); do echo $x; done > file )。

$> R -q -e "x <- read.csv('file', header=F); summary(x);"

> x <- read.csv('file', header=F); summary(x);
       V1       
 Min.   :    1  
 1st Qu.: 2501  
 Median : 5000  
 Mean   : 5000  
 3rd Qu.: 7500  
 Max.   :10000  

现在,人们可能会期待 cat正在读取文件并从 /dev/stdin 读取具有相同的输出,但它没有:
$> cat file | R -q -e "x <- read.csv('/dev/stdin', header=F); summary(x);"
> x <- read.csv('/dev/stdin', header=F); summary(x);
       V1       
 Min.   :    1  
 1st Qu.: 3281  
 Median : 5520  
 Mean   : 5520  
 3rd Qu.: 7760  
 Max.   :10000 

使用 table(x)显示跳过了一堆行:
    1  1042  1043  1044  1045  1046  1047  1048  1049  1050  1051  1052  1053 
    1     1     1     1     1     1     1     1     1     1     1     1     1 
 1054  1055  1056  1057  1058  1059  1060  1061  1062  1063  1064  1065  1066 
    1     1     1     1     1     1     1     1     1     1     1     1     1
 ...

看起来 R 正在用 stdin 做一些有趣的事情,因为这个 Python 将正确打印文件中的所有行:
cat file | python -c 'with open("/dev/stdin") as f: print f.read()'

This question似乎相关,但更多的是关于在格式错误的 CSV 文件中跳过行,而我的输入只是一个数字列表。

最佳答案

head --bytes=4K file | tail -n 3
产生这个:

1039
1040
104

这表明 R 在/dev/stdin 上创建了一个大小为 4KB 的输入缓冲区,并在初始化期间填充它。当您的 R 代码随后读取/dev/stdin 时,它会在此时在文件中启动:
   1
1042
1043
...

实际上,如果在文件中替换行 1041来自 1043 ,您会在 table(x) 中得到“3”而不是“1” :
3  1042  1043  1044  1045  1046  1047  1048  1049  1050  1051  1052  1053 
1     1     1     1     1     1     1     1     1     1     1     1     1 
...

第一1table(x)实际上是1041的最后一位.文件的前 4KB 已被吃掉。

关于R 跳过/dev/stdin 中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11123969/

相关文章:

r - 按 R 中指定的不规则间隔拆分 xts 对象

将矩阵重复 n 次到列表中

terminal - 无法从终端复制制表符

linux - 临时 shell 变量存储在 shell session 中的什么位置?

R:尝试在 filter.data.frame 中使用零长度变量名

r - 参数3使用 ‘mediate’包将多个形式参数与 ‘psych’函数匹配

r - 提取 Changeabel 字符串的一部分

c - C中的多个终端进程

r - VSCode : fixed current working directory for new R terminal in multi-root projects

bash - 向 WSL 自动完成建议添加常用命令