2列の2つのファイルを並べて印刷

2列の2つのファイルを並べて印刷

2つのテキストファイルを2つの列(左側に1つ、右側に1つ)として出力したいと思います。

paste1文字だけが区切り文字で挿入されるため、問題は解決されません。したがって、最初のファイルに長さが異なる行がある場合、出力は歪みます。

$ cat file1
looooooooong line
line
$ cat file2
hello
world
$ paste file1 file2
looooooooong line   hello
line    world

末尾のスペースを追加するコマンドがあると、fmt --add-spaces --width 50問題は解決されます(1)

$ paste <(fmt --add-spaces --width 50 file1) file2
looooooooong line                                 hello
line                                              world

しかし、私はこれを行う簡単な方法がわかりません。

それでは、ファイルを水平にマージして歪みなしで標準出力に印刷するにはどうすればよいですか?

実はただ並んで置いて読んでみたかったです。


(1)修正する:たとえば、末尾のスペースを追加するコマンドがありますxargs -d '\n' printf '%-50s\n'。ただし、行数がそれより少ない場合、実行時に
$ paste <(add-trailing-spaces file1) file2 予想される視覚的出力は生成されません。file1file2

答え1

単一のprコマンドを使用します。

pr -Tm file[12]
  • -T--omit-pagination) - ヘッダーとフッターを省略し、入力ファイルに設定されている改ページで改ページを削除します。

  • -m--merge) - すべてのファイルを1列に1つずつ並列に印刷します。

答え2

何についてpaste file{1,2}| column -s $'\t' -tn

looooooooong line line  hello
line                    world
  • columnこれは列として使用される区切り文字を表し、通常指定されていない場合はデフォルトの区切り文字であるコマンドTabから取得されます。paste

    paste -d'X' file{1,2}| column -s $'X' -tn

    これはX単一文字を表します。ファイルに表示されないオプションを選択する必要があります。

  • この-tオプションは、入力に含まれる列の数を決定します。

  • 他の答えは、2つのファイルの間に長いタブ文字を追加しません。
  • file1 に空白行があり、2 番目のファイルが file1 の印刷領域に印刷されない場合にも機能します。、以下の入力/出力を参照してください。

    入力ファイル1:

    looooooooong line
    
    line
    

    入力ファイル2:

    hello
    world
    

    出力:

    looooooooong line  hello
                       world
    line
    

答え3

ポータブルソリューション:

$ paste file1 file2 | awk -F'\t' '{ printf("%-30s %s\n", $1, $2) }'
looooooooong line              hello
line                           world

pasteこれは、タブで区切られた入力を生成するために使用されますawk

スクリプトawkは、タブで区切られた2つのフィールドを取得しますprintf()。最初のファイルに対して30文字の列を予約します。これは%-30s、「文字列データの30桁が左揃え」を意味します。削除すると-列が右揃えになり、変更すると30列の幅が変わります。

長さが不均一なファイルも処理します。 2番目のファイルにいくつかの行を追加しました。

looooooooong line              hello
line                           world
                               hello
                               world
                               hello
                               world

そして、コマンドラインでファイルの順序を逆に変更すると、次のようになります。

hello                          looooooooong line
world                          line
hello
world
hello
world

答え4

努力する:

paste -d '\n' file1 file2 | xargs -d '\n' printf '%-30s  %-30s\n'

からインスピレーションを受ける@Kusalanandaのソリューション

注:-dパラメータはxargsBSDではなくGNUバージョンでのみ利用可能です。

関連情報