2

これらのファイルがあり、それらを Excel ファイルにマージしたい 各ファイルには 2 つの列があります

ファイル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 つの行があり、file14 つの行があるため、スクリプトはカンマで区切られた 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 に答える