假设我有几个这种格式的表(我会把示例数据放在最后)
表格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,因为在标题行中添加t1
s 和t2
s 会使它们不再与下面的行匹配。
根据你所有表格的具体情况,手动添加标题行可能会比弄清楚内容更容易sed
,然后手动删除重复的列,然后运行
paste -d '&' t2.txt t1.txt
它将会逐行合并内容。
抱歉,如果您使用的是 Windows,则无法帮助您(尽管您可能可以使用适用于 Linux 的 Windows 子系统 WSL 来完成)。