gpt4 book ai didi

R 跳过/dev/stdin 中的行

转载 作者:行者123 更新时间:2023-12-04 11:37:53 25 4
gpt4 key购买 nike

我有一个包含数字列表的文件(自己制作: 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com