一个链接可以全部阅读

时间:2016-01-22 10:04:27

标签: bash file

我正在寻找一种技巧,使我能够同时读取两个大文件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 的文件(为了避免重复信息,我收到了大文件,没有足够的存储容量来存储组合文件)。

有可能这样做吗?如果是,如何继续?

谢谢!

4 个答案:

答案 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)

您可以在后台执行命令列表,并将结果通过管道传输到命名管道,任何可执行文件都可以通过<(...) {{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 }}

因此,如果您的在支持命名管道的操作系统上运行,您只需键入:

/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