2016-10-26 8 views
5

私はbashスクリプトで作業しています。私は2つのファイルを並べて印刷したいと思います。 1つのファイルはIPv4アドレスで満たされ、もう1つはIPv6アドレスで埋められます。 試しましたが、出力をカットしました。BASH:2つのファイルを同時に並べて表示する

pr -mtw $WIDTH $FILE1 $FILE2 

┌────┤IPV4├─────┬─────────────────┤IPV6├────────────────┐ 
224.0.0.1  2001:0db8:0000: 
192.0.2.128  ff02::1 
192.0.2.128  2001:0db8:0000: 
192.0.2.128  :: 
       2001:0db8:0000: 
       2001:db8:0:0:0: 
       2001:db8::ff00: 
       0000:0000:0000: 
       ::1 
       fe80:: 
       ::ffff:192.0.2. 
       ::192.0.2.128 

私は出力が何かのように、

┌────┤IPV4├─────┬─────────────────┤IPV6├────────────────┐ 
224.0.0.1  2001:0db8:0000:0042:0000:8a2e:0370:7334 
192.0.2.128  ff02::1 
192.0.2.128  2001:0db8:0000:0000:0000:ff00:0042:8329 
192.0.2.128  :: 
       2001:0db8:0000:0000:0000:ff00:0042:8329 
       2001:db8:0:0:0:ff00:42:8329 
       2001:db8::ff00:42:8329 
       0000:0000:0000:0000:0000:0000:0000:0001 
       ::1 
       fe80:: 
       ::ffff:192.0.2.128 
       ::192.0.2.128 

FILE1になりたい私はまた、

paste $FILE1 $FILE2 | awk '$1=$1' OFS='\t ' 

を試してみましたが、出力があって、

┌────┤IPV4├─────┬─────────────────┤IPV6├────────────────┐ 
224.0.0.1 2001:0db8:0000:0042:0000:8a2e:0370:7334 
192.0.2.128 ff02::1 
192.0.2.128 2001:0db8:0000:0000:0000:ff00:0042:8329 
192.0.2.128 :: 
2001:0db8:0000:0000:0000:ff00:0042:8329 
2001:db8:0:0:0:ff00:42:8329 
2001:db8::ff00:42:8329 
0000:0000:0000:0000:0000:0000:0000:0001 
::1 
fe80:: 
::ffff:192.0.2.128 
::192.0.2.128 

224.0.0.1 
192.0.2.128 
192.0.2.128 
192.0.2.128 

FILE2:各行の先頭にスペースがあることを

2001:0db8:0000:0042:0000:8a2e:0370:7334 
ff02::1 
2001:0db8:0000:0000:0000:ff00:0042:8329 
:: 
2001:0db8:0000:0000:0000:ff00:0042:8329 
2001:db8:0:0:0:ff00:42:8329 
2001:db8::ff00:42:8329 
0000:0000:0000:0000:0000:0000:0000:0001 
::1 
fe80:: 
::ffff:192.0.2.128 
::192.0.2.128 

注意。 アイデアawktrGNU pasteコマンドを使用して

+1

個別のファイルの内容を試しに分けて共有できますか? – Inian

+0

入力ファイルを表示できますか?またはそれらの例? 'paste'は私のために働くが、あなたが入力として持っているものは分からない。 –

+0

最終出力にスペースが必要な場合や空でない場合がありますか? – Inian

答えて

1

これは

paste "$FILE1" "$FILE2" | awk -F'\t' '{printf("%-16s%s\n", $1, $2)}' 
2

: -

$ paste file1 file2 | awk -v FS='\t' '{printf("%-15s %s\n",$1,$2)}' | \ 
      awk '{sub(/^/, " ", $0)}1' 

224.0.0.1  2001:0db8:0000:0042:0000:8a2e:0370:7334 
192.0.2.128  ff02::1 
192.0.2.128  2001:0db8:0000:0000:0000:ff00:0042:8329 
192.0.2.128  :: 
       2001:0db8:0000:0000:0000:ff00:0042:8329 
       2001:db8:0:0:0:ff00:42:8329 
       2001:db8::ff00:42:8329 
       0000:0000:0000:0000:0000:0000:0000:0001 
       ::1 
       fe80:: 
       ::ffff:192.0.2.128 
       ::192.0.2.128 

あなたが最後には、第二1でawkをパイプそれを行う方法を正確にわからなかった最適化することができます。そうでなければ、これは動作します!

paste -d, file1 file2 | column -s',' -n -t 

pasteコマンドは、セパレータ,とラインで両方のファイルの行を結合します:

+0

時間の出力は同じです。 – xtonousou

+0

私は時間を改善するかもしれない 'tr'なしでコマンドを更新しましたが、その遅延の量は真剣に重要ですか? – Inian

+0

多くのコード行がある場合、最も速い方法の使用を検討してください。私の質問にお答えいただきありがとうございます。 – xtonousou

1

あなたはコマンドcolumnを使用することができます正常に動作します。

カラムコマンドは、,を、適切にインデントさせるために必要なスペースで置き換えます(オプション:-t)。 -nは、columnに空欄を記入しています。 オプション-nはDebian固有のものです。

+0

'カラム:無効なオプション - 'n''、私はそれをテストするDebianベースのマシンを持っていません。 – xtonousou

関連する問題