【问题标题】:How to concatenate two files (removing the first line of the second file) in a single line of unix command?如何在一行unix命令中连接两个文件(删除第二个文件的第一行)?
【发布时间】:2017-06-03 03:38:58
【问题描述】:

我正在尝试通过将两个文件(file1file2)堆叠在一起来创建一个新文件(比如file3)。我需要整个file1,但想排除file2 的第一行。我现在有一个使用headsed 的两步过程。

cat file1.csv file2.csv > file3.csv
sed -i 1001d file3.csv

最后一步要求我找出file1 的长度,然后再删除之后的行,使其与file2 的第一行相对应。如何将这两行合并为一行代码?我试过了,但失败了:

cat file1.csv sed 1d file2.csv > file3.csv

【问题讨论】:

  • edit 您的问题包括简洁、可测试的样本输入和预期输出。

标签: file unix sed merge


【解决方案1】:

你可以使用这样的复合语句:

{ cat file1.csv; sed '1d' file2.csv; } > file3.csv

【讨论】:

  • 这行得通。谢谢!大括号内的代码逻辑是什么?
  • 第一条语句打印file1.csv 的内容,第二条语句打印file2.csv 的内容,但由于1d 而删除/忽略了第一行。然后将两个语句的组合输出写入file3.csv。就像你真正要求的那样;-)
【解决方案2】:

您可以使用进程替换,例如:

cat file1.csv <(tail -n +2 file2.csv) > file3.csv

【讨论】:

    【解决方案3】:

    一种方法是cat file1.csv &gt; file3.csv; tail -n +2 file2.csv &gt;&gt; file3.csv

    另一个是tail -n +2 file2.csv | cat file1.csv - &gt; file3.csv

    【讨论】:

      【解决方案4】:

      您可以使用第二次尝试,但要使用进程替换:

      cat file1.csv <(sed '1d' file2.csv) > file3.csv
      

      您的命令失败,因为 sed 被视为 cat 试图访问的文件名。

      如果你的 shell 不支持进程替换,你可以改用这个:

      sed '1d' file2.csv | cat file1.csv - > file3.csv
      

      或者,您可以使用 awk:

      awk 'FNR!=NR && FNR==1 {next} 1' file{1,2}.csv > file3.csv
      

      FNR!=NR 为真,如果我们不在第一个文件中(文件记录号不等于总记录号),FNR==1 在每个文件的第一行为真。除了第一个文件之外,每个文件的第一行的条件都为真; next 跳过该行。 1 打印所有其他行。

      【讨论】:

      • 我尝试了您的第一个选项和它的其他变体,并收到以下错误:sh.exe": cannot make pipe for process substitution: Function not implemented
      • 看起来你的 shell 不支持进程替换。我会更新答案。
      • 我正在使用 git bash
      • 您应该编辑您的问题以包含您正在使用的外壳
      猜你喜欢
      • 2020-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-01
      • 1970-01-01
      • 2021-10-16
      • 2011-06-10
      • 1970-01-01
      相关资源
      最近更新 更多