
2つのテキストファイルを2つの列(左側に1つ、右側に1つ)として出力したいと思います。
paste
1文字だけが区切り文字で挿入されるため、問題は解決されません。したがって、最初のファイルに長さが異なる行がある場合、出力は歪みます。
$ 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
予想される視覚的出力は生成されません。file1
file2
答え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
パラメータはxargs
BSDではなくGNUバージョンでのみ利用可能です。