我正在寻找一种技巧,使我能够同时读取两个大文件A和B的内容,类似虚拟连接它们。 因此,使用此功能,并且对于后续分析,将考虑A和B的内容。
FILE1.TXT
Hello World
FILE2.TXT
Foo Bar
我正在考虑类似的事情:
ln --ghostFile file1.txt,file2.txt newFile.link
myProgram --input newFile.link
Hello World
Foo Bar
但是,请注意我不希望创建一个大小为A + B 的文件(为了避免重复信息,我收到了大文件,没有足够的存储容量来存储组合文件)。
有可能这样做吗?如果是,如何继续?
谢谢!
答案 0 :(得分:2)
如果您受到限制,无法创建新文件,则根本不要更改任何文件。 cat
命令接受多个参数并一个接一个地输出它们。有点像你的“鬼文件”。
$ cat file1.txt file2.txt
Hello World
Foo Bar
当然,如果您不仅需要内容,还需要文件大小,或者更改组合文件(或其他内容)的能力,那么您最好创建真实的内容。
答案 1 :(得分:2)
你可以使用hacky fifo,但它仍然没有真正做你想做的事情
$ mkfifo newFile.link
$ while :;do cat file1.txt file2.txt > newFile.link;sleep 0.5;done &
这只是重复连接两个文件并将它们留在管道中进行读取。
需要循环,因为无论何时从FIFO读取管道都会关闭。
睡眠是为了防止数据写入过快而导致数据在管道中重复。
&安培;是这样你当前的会议继续。
然后,您可以像普通文件一样访问它。
$ cat newFile.link
Hello World
Foo Bar
答案 2 :(得分:2)
您可以在后台执行命令列表,并将结果通过管道传输到命名管道,任何可执行文件都可以通过<(...)
bash {{3}将其读取为普通文件}。这将转换为/dev/fd/<NUMBER>
。
以下是它的用法示例(我有两个名为x.cc&amp; x.cpp的C ++文件):
$ echo <(cat x.cc x.cpp)
/dev/fd/63
$ ls -l <(cat x.cc x.cpp)
lr-x------ 1 truey truey 64 Jan 22 10:10 /dev/fd/63 -> pipe:[398070170]
$ grep '^#include' <(cat x.cc x.cpp)
#include <iostream>
#include <string>
#include <iostream>
#include <string>
#include <vector>
$ grep '^#include' < <(cat x.cc x.cpp) # Mind the gap in < <
#include <iostream>
#include <string>
#include <iostream>
#include <string>
#include <vector>
第一个process substitution打开名为/dev/fd/63
(或类似)的名称管道(FIFO),第二个只打开stdin,实际上是重定向到(或从?:)){{1 }}
因此,如果您的grep在支持命名管道的操作系统上运行,您只需键入:
/dev/fd/63
答案 3 :(得分:-1)
比这简单得多。
您可以使用cat
打印出文件内容。
我有两个文件file1和file2,内容为CNT1和CNT2,如下所示:
cat file1
CNT1
cat file2
CNT2
如果您想在文件中添加内容,可以编写
echo "foo" > file1
,文件内容为:
cat file1
foo
如果您想在文件末尾添加内容,则必须使用>>
echo "CNT1" >> file1
cat file1
foo
CNT1
因此,在您的情况下,请使用cat
和>>
,如下所示:
<强> cat file2 >> file1
强>
结果将是
cat file1
foo
CNT1
CNT2