두 기둥 사이의 간격을 조정하여 직선으로 보이도록 합니다.

두 기둥 사이의 간격을 조정하여 직선으로 보이도록 합니다.

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


물론, 서식을 지정하기 위해 자신만의 스크립트를 작성할 수도 있습니다. 다음은 사용되는 한 가지 방법입니다 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)

관련 정보