linux - 在多个 tsv(制表符分隔)文件中粘贴标题行

标签 linux bash unix

我有多个名为 choochoo1.tsvchoochoo2.tsv、... choochoo(nth).tsv 文件的 .tsv 文件.我还有一个 main.tsv 文件。我想提取 main.tsv 中的标题行并粘贴到所有 choochoo(nth).tsv 文件中。请注意,目录中还有其他 .tsv 文件,我不想更改或粘贴标题,所以我无法执行 *.tsv 并全选.tsv 文件(因此需要为想要的文件选择 choochoo 字符串)。这是我使用 bash 脚本尝试过的,但无法使其工作。请建议正确的方法。

for x in *choochoo; do
    head -n1 main.tsv > $x
done

最佳答案

您的文件 glob 以及重定向有问题:

  • 文件 glob 会捕获类似 AAchoochoo 但不是 choochoo1.tsv 甚至 AAchoochoo.tsv
  • 重定向将覆盖现有文件而不是添加它们。添加到文件的重定向命令是 >>>,但它会将文本附加到末尾,而您想在开头添加文本。

将文本添加到现有文件的问题在于,您必须打开文件进行读写,然后按顺序流式传输添加的文本和原始文本——这通常是人们失败的地方,因为 shell 可以不要那样打开文件(有一种稍微复杂的直接执行此操作的方法,即打开文件进行读写,但我不打算进一步解决这个问题)。

你可能想使用一个临时文件,像这样:

for x in choochoo[0-9]*.tsv; do
  mv "$x"{,.orig}
  (head -n1 main.tsv; cat "$x.orig") > $x
  rm "$x.orig"
done

关于linux - 在多个 tsv(制表符分隔)文件中粘贴标题行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34390121/

相关文章:

linux - Solaris 等效于拖尾文件中的字符数量

php - PHP 中的 authz svn 文件解析器

linux - root 或非 root 用户的 HDFS start-all.sh

clock_gettime() undefined symbol SunOS

未执行 Java 命令

bash - 从bash中的文件读取的行中删除换行符

bash - 如何将输入通过管道传递给 Bash while 循环并在循环结束后保留​​变量

c - 在unix中执行wc命令的程序。字数错误

linux - 将 Linux 团体意识形态应用于 Web 应用程序

linux - 如果 shell 脚本中发生错误,通过电子邮件通知