我试图在同一行上为多个文件运行多个命令。我对 Linux 的经验很少,并且在使用此命令时遇到了问题:
tail -n +3 "/usr/local/tmp/csce215/election2008/"*/*.csv | head -n -1 > polls.csv
我试图通过连续使用 tail 和 head 来获取每个文件的“中间部分”。不幸的是,tail 正确地为每个文件运行,但 head 似乎只为最后一个文件运行。是否可以通过一个命令来完成此操作,或者是否有更好的方法来执行此操作?我更喜欢使用头部和尾部。
答案1
问题是tail
创建一个单一的数据流来传递给head
,这就是那里所使用的。
相反,您需要处理每个文件tail
并head
在 polls.csv 文件中使用该结果。
一行代码看起来像这样:
shopt -s nullglob; for name in "/usr/local/tmp/csce215/election2008/"*/*.csv; do echo "==> $name" >> polls.csv; tail -n +3 "$name" | head -n -1 >>polls.csv; echo "" >> polls.csv; done;
如果没有可查找的 *.csv 文件,shopt -s nullglob 可防止不必要的操作。
当然,由于这使用附加到文件进行重定向,因此您需要在每次使用后删除 polls 文件,否则它会继续增长。或者,修改命令以在开始时破坏它:
echo "" > polls.csv; shopt -s nullglob; for name in "/usr/local/tmp/csce215/election2008/"*/*.csv; do echo "==> $name" >> polls.csv; tail -n +3 "$name" | head -n -1 >>polls.csv; echo "" >> polls.csv; done;
由于屏幕限制,它不会显示为一行,但无论如何都将其键入一行。复制/粘贴应该将其保留为一行。