2

我有这些文件,我想将它们合并到一个 excel 文件中,每个文件都有两列

文件 1

title1
 1 1 
 2 2 
 3 3

文件2

title2
 5 5
 6 6 
 7 7
 8 8 
 9 9
 10 10

文件 3

title3
21 21
22 22
23 23
24 24

我使用下面的命令将它们合并到一个 excel 文件中

paste file* > out.csv

正常输出没问题,但是当我把它放在一个excel文件(out.csv)中时,输出变成了这样

title1 title2 title3
1  1   5  5   21  21
2  2   6  6   22  22
3  3   7  7   23  23
   8  8   24  24
   9  9
  10 10

我想要这个输出

title1 title2 title3
1  1   5  5   21  21
2  2   6  6   22  22
3  3   7  7   23  23
       8  8   24  24
       9  9 
       10 10

每个数字应该在单独的单元格、单独的列中并且正好在彼此的下方,但是当文件的大小比前一个文件长时,附加的数字会回到最后一列并低于前一个文件编号,例如数字 8,9 ,10 和 24

4

2 回答 2

2

您可以尝试以下脚本:

#!/bin/bash
maxLines=$(wc -l file1 file2 file3 | grep -v total | sort -nr | head -1 | awk '{print $1}')
for f in file1 file2 file3
do
    sed 's/ /,/g' "$f" > "$f".tmp
    lineCount=$(wc -l < $f.tmp)
    linesToAdd=$((maxLines-lineCount))
    for ((i=0;i<linesToAdd;i++))
    do
        echo "," >> "$f".tmp
    done
done
paste -d, file{1,2,3}.tmp | sed '1 s/,/,,/g'
rm file*.tmp

输出:

$ myscript.sh
title1,,title2,,title3
1,1,5,5,21,21
2,2,6,6,22,22
3,3,7,7,23,23
,,8,8,24,24
,,9,9,,
,,10,10,,

该脚本通过计算文件中的最大行数然后将额外的行附加到其他文件来工作。例如,在本例中,file2有 7 行,file1有 4 行,因此脚本会临时将额外的 3 行以逗号分隔的行添加到file1. 最后,paste用于合并文件。

于 2013-07-15T08:08:29.480 回答
1

尝试这个:

#/bin/bash
maxcount=`read wc -l file1  file2  file3 | sort -h -r | sed -rn '2s/^ *([0-9]+).*/\1/'`
exec 4<file1
exec 5<file2
exec 6<file3
while [ $maxcount -gt 0 ]; do
    read -a f1<&4
    read -a f2<&5
    read -a f3<&6
    echo ${f1[0]},${f1[1]},${f2[0]},${f2[1]},${f3[0]},${f3[1]}
    ((maxcount--))
done
exec 4<&-
exec 5<&-
exec 6<&-

我将每个文件的最大列硬编码为 2。但是,如果情况不同,您可以获得每个文件的最大列并运行一个循环echo -n ${f1[$i]}

于 2013-07-15T10:09:33.900 回答