2つの柱間の間隔を調整して直線に見えるようにします。

2つの柱間の間隔を調整して直線に見えるようにします。

file1.txt:

hi
wonderful
amazing
sorry
superman
superhumanwith
loss

file2.txt:

1
2
3
4
5
6
7

Paste -d" " file1.txt file2.txt >actualout.txt を使用して結合しようとすると

actualout.txt:

hi 1
wonderful 2
amazing 3
sorry 4
superman 5
superhumanwith 6
loss 7

しかし、私の出力は次のようになりたいです。

OUT.txt:

hi             1
wonderful      2
amazing        3 
sorry          4
superman       5 
superhumanwith 6
loss           7

2つのファイルを組み合わせて目的の出力のように見せるために使用できるコマンドは何ですか? Solaris 5.10 ksh nawk, sed, 貼り付け

答え1

あなたが必要なようですcolumn

paste file1.txt file2.txt | column -tc2

次の出力が生成されます。

hi              1
wonderful       2
amazing         3
sorry           4
superman        5
superhumanwith  6
loss            7


もちろん、書式を設定するために独自のスクリプトを書くこともできます。以下は、使用される1つの方法ですawk

awk '
  NR==FNR { a[FNR] = $0 ; if (length > max) max = length ; next }
  { printf "%-*s  %s\n", max, a[FNR], $0 }
' file1.txt file2.txt

答え2

pr

私は以下を選択できますpr

printf %s\\n hi wonderful amazing sorry  \
             superman superhumanwith loss >/tmp/file
#^what is all of that, anyway?^

seq 7 | pr -tm /tmp/file -

pr-m入力ファイルをマージできます。(こちら/tmp/file-標準入力)行別はpaste列別に似ていますが、時間がかかる場合があります。たくさんこの他に他のパラメータ。デフォルトでは、ヘッダーとフッターも印刷しますが、-t圧縮します。

出力:

hi                      1
wonderful               2
amazing                 3
sorry                   4
superman                5
superhumanwith          6
loss                    7

expand

より具体的な情報を直接取得することに興味がある場合は、別のオプションは次のexpandとおりです。仮想タブストップリストを提供できるので、拡張必要なスペースを埋めてください。

seq 7 | paste /tmp/file - | expand -t15

-tもちろん、ここでは最初のAbstopだけが必要です。

hi             1
wonderful      2
amazing        3
sorry          4
superman       5
superhumanwith 6
loss           7

…でももっと欲しいなら…

seq 14 | paste /tmp/file - /tmp/file - | expand -t15,23,38,46

...私たちはコンマで区切られた化合物のリストでスペルを表示できます...

hi             1       hi             2
wonderful      3       wonderful      4
amazing        5       amazing        6
sorry          7       sorry          8
superman       9       superman       10
superhumanwith 11      superhumanwith 12
loss           13      loss           14

grep:

末尾のスペースを計算せずに標準の8文字タブの停止位置だけ増やしながらファイル内の最長行の長さを見つけるには、次のようにします。

i=0
while grep -Eq ".{$(((i+=8)-1))}.*[^[:blank:]]" <infile; do :; done

$iループは実行され、検索されるたびに8ずつ増加します。<infile計算された数以上の文字を含み、$iその後に空白以外の文字を含む行の場合。したがって、grepそのような行が見つからない場合はfalseを返し、サンプルデータに次のものを割り当てます。

echo "$i"
16

wc:

しかし、これはPOSIXソリューションです。 GNUシステムで実行できる最も簡単な作業は次のとおりです。

wc -L <infile

...最も長い行の長さをリストします。<infileただし、これには末尾のスペースの数が含まれます。

答え3

この仕事にこだわる場合awk

awk -v file=file2.txt '{
        cnt++
        a[cnt] = $0
        getline b[cnt] <file
        if(length(a[cnt]) > max)
            max = length(a[cnt])
    }
    END {
        max++
        for(i = 1; i <= cnt; i++)
            printf "%-" max "s%s\n", a[i], b[i]
    }' file1.txt

注:私はこの特別なホイールが何度も再作成されたと確信していますが、今は以前のSE / SOアートの正しい例を見つけるために、私の脳が正しい呪文を思い出すように強くしたくありません。 :)

答え4

まあ、私が探していたものを見つけました。これはSolaris 5.10で動作します。

paste file1 file2| pr -t -e$(awk 'n<length {n=length} END {print n+1}' file1)

最も長い文字列の長さを最初のファイルに保存し、タブの区切りに使用します。

複数ファイルのシナリオ

どのファイルに最長の単語があるかを知っている場合は、長さを計算するときにファイル名を変更して貼り付けを使用して複数のファイルをリンクします。 file4.txtに最も長い文字列がある場合。もしそうなら、解決策は

paste file1 file2 file3 file4 | pr -t -e$(awk 'n<length {n=length} END {print n+1}' file4)

関連情報