如何连接三个文件(并跳过一个文件的第一行)并将其作为输入发送到我的程序?

Joh*_*ohn 4 shell-script text-processing

有文件 A、B、C。我想连接文件 A、B 和 C(跳过 C 的第一行)。然后将它们作为输入发送到 myProgram。我怎样才能在shell脚本中写这个?

我是这么写的

cat A > file
echo >> file     //want to start all contents in new line
cat B >> file
tail -n+2 C >> file
./myProgram < file 
Run Code Online (Sandbox Code Playgroud)

但我不知道如何连接它们并发送到程序而不生成文件

Gil*_*not 12

尝试这个 :

{ cat A ; echo; cat B ; awk 'NR>1' C ; } | programm
Run Code Online (Sandbox Code Playgroud)

将命令放在大括号内分组

;如果没有换行符来完成分组,则不是强制性的。

并且这里不需要另一个子shell ;)


Mia*_*ati 6

使用进程替换

./myProgram < <(cat A; echo ''; cat B; tail -n +2 C)
Run Code Online (Sandbox Code Playgroud)

<(commands) 创建一个 fifo 文件,然后读入程序

你可以通过做测试

$ echo <(cat A; echo ''; cat B; tail -n +2 C) /dev/fd/63

在支持命名管道 (FIFO) 或命名打开文件的 /dev/fd 方法的系统上支持进程替换。它采用 <(list) 或 >(list) 的形式。进程列表运行时其输入或输出连接到 FIFO 或 /dev/fd 中的某个文件。该文件的名称作为扩展的结果作为参数传递给当前命令。如果使用 >(list) 形式,写入文件将为列表提供输入。如果使用 <(list) 形式,则应读取作为参数传递的文件以获得 list 的输出。如果可用,进程替换与参数和变量扩展、命令替换和算术扩展同时执行。


小智 5

使用子shell。在子 shell 中运行命令并将输出通过管道传输到您的程序。

(cat a; echo; cat b; tail -n+2 c) | ./myProgram
Run Code Online (Sandbox Code Playgroud)