두 파일을 나란히 표시
서로 다른 길이의 정렬되지 않은 텍스트 파일 2 개를 나란히 (열로) 표시 하는 방법shell
주어진 one.txt
및 two.txt
:
$ cat one.txt
apple
pear
longer line than the last two
last line
$ cat two.txt
The quick brown fox..
foo
bar
linux
skipped a line
디스플레이:
apple The quick brown fox..
pear foo
longer line than the last two bar
last line linux
skipped a line
paste one.txt two.txt
거의 트릭을 수행하지만 열 1과 2 사이에 하나의 탭을 인쇄하기 때문에 열을 멋지게 정렬하지 않습니다. emacs 및 vim을 사용하는 방법을 알고 있지만 파이핑 요법을 위해 출력을 표준 출력으로 표시하고 싶습니다.
내가 생각 해낸 해결책 sdiff
은 출력을 제거하기 위해 sed를 사용 하고 파이프를 sdiff
추가합니다.
sdiff one.txt two.txt | sed -r 's/[<>|]//;s/(\t){3}//'
함수를 만들어 내 안에 붙일 수 .bashrc
있지만 확실히 이것에 대한 명령이 이미 존재 합니까 (또는 잠재적 으로 더 깨끗한 솔루션)?
당신은 사용할 수 있습니다 pr
사용하여이 작업을 수행하기 위해 -m
파일을 열 하나씩 및 병합 플래그를 -t
생략 헤더에, 예를.
pr -m -t one.txt two.txt
출력 :
apple The quick brown fox..
pear foo
longer line than the last two bar
last line linux
skipped a line
또한보십시오:
@Hasturkun 의 답변 에 대해 조금 확장하려면 기본적 pr
으로 출력에 72 열만 사용하지만 터미널 창에서 사용 가능한 모든 열을 사용하는 것은 비교적 쉽습니다.
pr -w $COLUMNS -m -t one.txt two.txt
대부분의 셸은 터미널의 화면 너비를 환경 변수에 저장 (및 업데이트)$COLUMNS
하므로 해당 값을에 전달 pr
하여 출력 너비 설정에 사용합니다.
이것은 또한 @Matt 의 질문에 대답합니다.
pr이 화면 너비를 자동 감지하는 방법이 있습니까?
So, no: pr
itself can't detect the screenwidth, but we're helping out a bit by passing in the terminal's width via the -w
option.
paste one.txt two.txt | awk -F'\t' '{
if (length($1)>max1) {max1=length($1)};
col1[NR] = $1; col2[NR] = $2 }
END {for (i = 1; i<=NR; i++) {printf ("%-*s %s\n", max1, col1[i], col2[i])}
}'
Using *
in a format specification allows you to supply the field length dynamically.
If you know the input files have no tabs, then using expand
simplifies @oyss's answer:
paste one.txt two.txt | expand --tabs=50
If there could be tabs in the input files, you can always expand first:
paste <(expand one.txt) <(expand two.txt) | expand --tabs=50
remove dynamically field length counting from Barmar's answer will make it a much shorter command....but you still need at least one script to finish the work which could not be avoided no matter what method you choose.
paste one.txt two.txt |awk -F'\t' '{printf("%-50s %s\n",$1,$2)}'
If you want to know the actual difference between two files side by side, use diff -y
:
diff -y file1.cf file2.cf
You can also set an output width using the -W, --width=NUM
option:
diff -y -W 150 file1.cf file2.cf
and to make diff
's column output fit your current terminal window:
diff -y -W $COLUMNS file1.cf file2.cf
There is a sed
way:
f1width=$(wc -L <one.txt)
f1blank="$(printf "%${f1width}s" "")"
paste one.txt two.txt |
sed "
s/^\(.*\)\t/\1$f1blank\t/;
s/^\(.\{$f1width\}\) *\t/\1 /;
"
(Of course @Hasturkun 's solution pr
is the most accurate!):
diff -y <file1> <file2>
[root /]# cat /one.txt
apple pear longer line than the last two last line
[root /]# cat /two.txt
The quick brown fox.. foo bar linux
[root@RHEL6-64 /]# diff -y one.txt two.txt
apple | The quick brown fox.. pear | foo longer line than the last two | bar last line | linux
Find below a python based solution.
import sys
# Specify the number of spaces between the columns
S = 4
# Read the first file
l0 = open( sys.argv[1] ).read().split('\n')
# Read the second file
l1 = open( sys.argv[2] ).read().split('\n')
# Find the length of the longest line of the first file
n = len(max(l0, key=len))
# Print the lines
for i in xrange( max( len(l0), len(l1) ) ):
try:
print l0[i] + ' '*( n - len(l0[i]) + S) + l1[i]
except:
try:
print ' ' + ' '*( n - 1 + S) + l1[i]
except:
print l0[i]
Example
apple The quick brown fox..
pear foo
longer line than the last two bar
last line linux
skipped a line
참고URL : https://stackoverflow.com/questions/13341832/display-two-files-side-by-side
'programing' 카테고리의 다른 글
내 경우에 프로그래밍 방식으로 하나의 레이아웃을 다른 레이아웃 위에 표시하는 방법은 무엇입니까? (0) | 2020.09.18 |
---|---|
시간없이 Rails DateTime.now (0) | 2020.09.18 |
툴바 위에 ActionMode 표시 (0) | 2020.09.18 |
Webpack-webpack-dev-server : 명령을 찾을 수 없습니다. (0) | 2020.09.18 |
Ruby의 외부 프로세스 STDOUT에서 지속적으로 읽기 (0) | 2020.09.18 |