我想连接几个表,并将标题保留在第一行(因此每次连接新表时都不会有新的标题)。有谁知道这是怎么做到的吗?
我目前正在使用:
find "/dir/folder" name "*.dat" -exec cat {} + >> "/dir/folder/table.txt"
但我可以用它来摆脱标题。
答案1
使用 BSD/GNU sed
:
find "/dir/folder" -name "*.dat" -exec sed -se1d {} + >> "/dir/folder/table.txt"
...它指示单独处理所有输入文件,并为每个文件d
删除1
st 行。
如果表头尚未存在于 table.txt 中,您应该首先将其放在那里:
set -- /dir/folder/*.dat
head -n1 <"$1" >>/dir/folder/table.txt
find ...
如果所有*.dat
匹配项都在子目录中,则这将不起作用。
{ find /dir/folder -name \*.dat -exec \
sh -c 'head -n1 "$0"; kill "$PPID"' {} \;
find /dir/folder -name \*.dat -exec sed -se1d {} +
} >>/dir/folder/table.txt
应该如此。
答案2
如果标题位于一行,使用 GNU tail
:
find "/dir/folder" -name "*.dat" -exec tail -qn +2 {} +
POSIXly,您需要tail
为每个文件运行一个:
要保留第一个文件的标头,GNUly:
find "/dir/folder" -name "*.dat" -print0 | {
IFS= read -rd '' first &&
cat "$first" &&
xargs -r0 tail -qn +2
}
答案3
如果您的所有文件都可以放入一次awk
调用中:
find "/dir/folder" name "*.dat" -exec awk 'FNR == 1 && NR != 1 {next};1' {} +
答案4
tail
允许您跳过给定的行数:
find "/dir/folder" name "*.dat" -exec tail +2 {} + >> "/dir/folder/table.txt"