假设我有一个如下所示的文件(称为 sample.txt):
Row1,10
Row2,20
Row3,30
Row4,40
Run Code Online (Sandbox Code Playgroud)
我希望能够处理来自这个文件的流,它本质上是所有四行的成对组合(所以我们最终应该总共有 16 行)。例如,我正在寻找输出为的流(即高效)命令:
Row1,10 Row1,10
Row1,10 Row2,20
Row1,10 Row3,30
Row1,10 Row4,40
Row2,20 Row1,10
Row1,20 Row2,20
...
Row4,40 Row4,40
Run Code Online (Sandbox Code Playgroud)
我的用例是我想将此输出流式传输到另一个命令(如 awk)中,以计算有关此成对组合的一些指标。
我有一种方法可以在 awk 中做到这一点,但我担心的是我使用 END{} 块意味着我在输出之前基本上将整个文件存储在内存中。示例代码:
awk '{arr[$1]=$1} END{for (a in arr){ for (a2 in arr) { print arr[a] " " arr[a2]}}}' samples/rows.txt
Row3,30 Row3,30
Row3,30 Row4,40
Row3,30 Row1,10
Row3,30 Row2,20
Row4,40 Row3,30
Row4,40 Row4,40
Row4,40 Row1,10
Row4,40 Row2,20
Row1,10 Row3,30
Row1,10 Row4,40
Row1,10 Row1,10
Row1,10 Row2,20
Row2,20 Row3,30
Row2,20 Row4,40
Row2,20 Row1,10
Row2,20 Row2,20 …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 wget(或 ncftpget)从 NOAA FTP 服务器下载一年的数据。但是,由于 FTP 的开销(我认为),它花费的时间比它应该的要长。例如,这个命令
time wget -nv -m ftp://ftp:email@ftp.ncdc.noaa.gov/pub/data/noaa/2015 -O /weather/noaa/2015
Run Code Online (Sandbox Code Playgroud)
或者类似地,通过 ncftpget
ncftpget -R -T -v ftp.ncdc.noaa.gov /weather/noaa/ /pub/data/noaa/2015
Run Code Online (Sandbox Code Playgroud)
产生的结果。53分钟转30M!
FINISHED --2015-01-03 16:21:41--
Total wall clock time: 53m 32s
Downloaded: 12615 files, 30M in 7m 8s (72.6 KB/s)
real 53m32.447s
user 0m2.858s
sys 0m8.744s
Run Code Online (Sandbox Code Playgroud)
当我观看此传输时,每个单独的文件传输速度都非常快(500kb/秒),但下载 12,000 个相对较小的文件的过程会产生大量开销并减慢整个过程。
我的问题: