连接不带表头的表

连接不带表头的表

我想连接几个表,并将标题保留在第一行(因此每次连接新表时都不会有新的标题)。有谁知道这是怎么做到的吗?

我目前正在使用:

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删除1st 行。

如果表头尚未存在于 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"

相关内容