如何按一列合并乳胶表

如何按一列合并乳胶表

假设我有几个这种格式的表(我会把示例数据放在最后)

表格1

在此处输入图片描述

表 2

在此处输入图片描述

如您所见,variables两个表中的列是相同的。

我正在 overleaf 中工作,因此我将表格(1 和 2)作为 tex 文件保存在一个文件夹中。

我怎样才能合并这两个表,以便得到以下结果:

期望输出: 在此处输入图片描述

有没有什么函数可以做到这一点?因为我有很多表,而且我觉得“手动”做这件事很笨拙

提前致谢!!

示例数据:表 1

\begin{table}[]
\centering
\begin{tabular}{@{}llll@{}}
\toprule
variables & group a & group b & diff \\ \midrule
x         & a11     & b12     & d13  \\
y         & a21     & b22     & d23  \\
z         & a31     & b32     & d33  \\ \bottomrule
\end{tabular}
\end{table}

表 2

\begin{table}[]
\centering
\begin{tabular}{@{}llll@{}}
\toprule
variables & group a & group b & diff \\ \midrule
x         & c11     & f12     & g13  \\
y         & c21     & f22     & g23  \\
z         & c31     & f32     & g33  \\ \bottomrule
\end{tabular}
\end{table}

期望输出:

\begin{table}[]
\centering
\begin{tabular}{@{}lllllll@{}}
\toprule
variables & group a t2 & group b t2 & diff t2 & group a t1 & group b t1 & diff t1 \\ \midrule
x         & c11        & f12        & g13     & a11        & b12        & c13     \\
y         & c21        & f22        & g23     & a21        & b22        & c23     \\
z         & c31        & f32        & g33     & a31        & b32        & c33     \\ \bottomrule
\end{tabular}
\end{table}

答案1

如果您使用的是基于 Unix 的系统(例如 Linux;也许是 MacOS:我还没有在那里测试过),您可以使用该paste命令来完成此操作。

首先将表的“内容”保存为文件:

t1.txt

variables & group a & group b & diff \\ \midrule
x         & a11     & b12     & d13  \\
y         & a21     & b22     & d23  \\
z         & a31     & b32     & d33  \\ \bottomrule

t2.txt

variables & group a & group b & diff \\ \midrule
x         & c11     & f12     & g13  \\
y         & c21     & f22     & g23  \\
z         & c31     & f32     & g33  \\ \bottomrule

现在在终端中的 bash 或 zsh 中运行此命令:

paste -d '&' <(sed -e 's/\\.*//' -e '1s/&/t2 \&/g' \
    -e '1s/variables t2/variables/' -e '1s/$/t2 /' t2.txt) \     
    <(sed -e 's/^[^&]*&//' -e '1s/&/t1 \&/g' -e 's/\\/t1 \\/' \
    t1.txt) | column -s '&' -o '&' -t

输出如下:

variables & group a t2 & group b t2 & diff t2 & group a t1 & group b t1 & diff t1 \\ \midrule
x         & c11        & f12        & g13     & a11        & b12        & d13  t1 \\
y         & c21        & f22        & g23     & a21        & b22        & d23  t1 \\
z         & c31        & f32        & g33     & a31        & b32        & d33  t1 \\ \bottomrule

让我来分析一下。

paste命令将逐行合并按相同顺序排列的文件。-d '&'指示它使用&而不是默认的制表符作为分隔符。

但是,我们想在合并之前修改文件,因此我们使用构造<(...)代替文件名,这些将指向括号内的命令的输出。

现在考虑第一个:

sed -e 's/\\.*//' -e '1s/&/t2 \&/g' -e '1s/variables t2/variables/' -e '1s/$/t2 /' t2.txt

sed命令对文件执行了四次替换t2.txt。第一个命令's/\\.*//'删除了每行中的部分\\,因为我们不想重复。第二个命令'1s/&/t2 \&/g'在每个部分之前添加“t2”,但只在第一行。由于我们不想在“variables”后面添加&“t2”,所以第三个命令1s/variables t2/variables/首先删除了“t2” t2。最后'1s/$/t2 /'在第一行末尾添加“t2”。

这个输出将会和另一个的输出逐行合并。

sed -e 's/^[^&]*&//' -e '1s/&/t1 \&/g' -e '1s/\\/t1 \\/' t1.txt

这里对 进行了三次替换t1.txt。第一次's/^[^&]*&//'删除了每行中直到第一行为止的所有内容&,因为我们不想重复两个表共有的第一列。第二次再次在第一行的每个行之前'1s/&/t1 \&/g'添加。并将“t1”放在 之前的最后一列中。t1&'1s/\\/t1 \\/'\\

其输出或多或少已经是您想要的,但我还将其输入到:

column -s '&' -o '&' -t

这将添加额外的空格以对齐&输出中的所有 s,因为在标题行中添加t1s 和t2s 会使它们不再与下面的行匹配。

根据你所有表格的具体情况,手动添加标题行可能会比弄清楚内容更容易sed,然后手动删除重复的列,然后运行

paste -d '&' t2.txt t1.txt

它将会逐行合并内容。

抱歉,如果您使用的是 Windows,则无法帮助您(尽管您可能可以使用适用于 Linux 的 Windows 子系统 WSL 来完成)。

相关内容