我正在做这个
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 中添加了退出命令。