如何“粘贴”两个文件而不写入新文件?

如何“粘贴”两个文件而不写入新文件?

我正在做这个

for pathname in /user/home/file_*; do
    cat "$pathname" | sed -n '3p'; printf"\n";
done> user/home/foo;

for pathname in /user/home/file_*; do
    cat "$pathname" | grep "word";
    printf"\n";
done> user/home/bar;

paste foo bar > combined

如何combined直接写入而不写入foo& bar?由于目录很大,尝试减少运行时间

我试过

for pathname in /user/home/file_*; do
    cat "$pathname" | sed -n '3p'; printf"\n";
done | paste > combined;

for pathname in /user/home/file_*; do
    cat "$pathname" | grep "word";
    printf"\n";
done | paste > combined;

但它会覆盖第一个列表

答案1

抱歉,可能误解了这个问题。可能与 https://stackoverflow.com/questions/31546680/how-to-pipe-grep-output-to-paste-input

“粘贴”命令采用 2 个或更多文件而不是流,保留列结构并将它们从左到右放在组合文件中。对于从左到右组合列,以下链接可能会很有趣: https://www.geeksforgeeks.org/paste-command-in-linux-with-examples/ 在“2.与其他命令的组合”部分中,他们讨论了与“cut”的组合。如果 file1 有 2 列,由制表符分隔; file2 有 1 列;您可以进行连续的剪切和粘贴管道:

cut -d\      -f1-2 file1 | paste - file2 | cut -d\   -f1-3 | paste - file3

其中 -d\ 后面的不可见字符是制表符(命令行上的 ctl-V 制表符,实际上制表符可能是“剪切”的默认分隔符,就像“粘贴”一样),每个“粘贴”后面的连字符是管道输入流的列的位置。

或像这样,因为所有列都被保留:

cut -d\      -f1-2 file1 | paste - file2 | paste - file3

如果您想要将第二个文件的所有输出放在第一个文件的输出下方,则使用子 shell 的原始建议

( source cmdLIST1.csh ; source cmdLIST2.csh ) > combinedOUTPUT.txt

可能有用。

Chai 的答案似乎适用于“bash”和“zsh”,但不适用于“tcsh”,并且可能是最简单的。

答案2

一种方法是调用 awk 要求它打印第三行和/或包含单词的行。输出一次合并粘贴 2 行,并写入名为合并的文件。请注意,这假设单词出现一次。

$ for pathname in /user/home/file_*; do
    awk '/word/;NR==3' < "$pathname" 
  done | paste  - - > combined

答案3

尝试这个

$ paste <(for pathname in /user/home/file_*; do cat "$pathname" | sed -n '3p'; printf "\n"; done) <(for pathname in /user/home/file_*; do cat "$pathname" | grep "word"; printf "\n"; done)

但我想,在幕后,shell 会使用一些临时文件。

答案4

for f in /user/home/file_*; do
    printf '%s\t%s\n' "$(sed -n '3{p;q;}' "$f")" "$(grep 'word' "$f")"
done > combined

如果文件很大,我在 sed 中添加了退出命令。

相关内容