더 나은 붙여넣기 명령

더 나은 붙여넣기 명령

다음 두 파일이 있습니다. 파일의 각 줄이 동일한 너비를 갖도록 줄을 점으로 채웠고 더 명확하게 만들기 위해 file1을 모두 대문자로 만들었습니다.

contents of file1:

ETIAM......
SED........
MAECENAS...
DONEC......
SUSPENDISSE

contents of file2

Lorem....
Proin....
Nunc.....
Quisque..
Aenean...
Nam......
Vivamus..
Curabitur
Nullam...

file2는 file1보다 깁니다.

이 명령을 실행할 때:

paste file1 file2

나는이 출력을 얻습니다

ETIAM...... Lorem....
SED........ Proin....
MAECENAS... Nunc.....
DONEC...... Quisque..
SUSPENDISSE Aenean...
    Nam......
    Vivamus..
    Curabitur
    Nullam...

다음과 같이 출력되도록 하려면 어떻게 해야 합니까?

ETIAM...... Lorem....
SED........ Proin....
MAECENAS... Nunc.....
DONEC...... Quisque..
SUSPENDISSE Aenean...
            Nam......
            Vivamus..
            Curabitur
            Nullam...

나는 노력했다

paste file1 file2 | column -t

하지만 이 작업은 다음과 같습니다.

ETIAM......  Lorem....
SED........  Proin....
MAECENAS...  Nunc.....
DONEC......  Quisque..
SUSPENDISSE  Aenean...
Nam......
Vivamus..
Curabitur
Nullam...

원래 출력만큼 ​​추악하지는 않지만 어쨌든 잘못된 열입니다.

답변1

파일에 탭 문자가 없다고 가정하면,

paste file1 file2 | expand -t 13

-tfile1에 필요한 최대 줄 너비를 포함하도록 적절하게 arg를 선택합니다 .

OP는 보다 유연한 솔루션을 추가했습니다.

나는 매직 넘버 13 없이도 작동하도록 이렇게 했습니다.

paste file1 file2 | expand -t $(( $(wc -L <file1) + 2 ))

입력하기는 쉽지 않지만 스크립트에서 사용할 수 있습니다.

답변2

나는 awk가 좋은 일을 할 수 있을 것이라고 생각하여 "awk 두 파일에서 입력을 읽는 중"을 검색하여 찾았습니다.stackoverflow에 관한 기사출발점으로 사용하세요.

먼저 요약 버전을 작성한 후 아래에서 전체 리뷰를 확인하세요. 이 문제를 해결하는 데 몇 분이 걸렸습니다. 똑똑한 사람들의 개선을 보게되어 기쁩니다.

awk '{if(length($0)>max)max=length($0)}
FNR==NR{s1[FNR]=$0;next}{s2[FNR]=$0}
END { format = "%-" max "s\t%-" max "s\n";
  numlines=(NR-FNR)>FNR?NR-FNR:FNR;
  for (i=1; i<=numlines; i++) { printf format, s1[i]?s1[i]:"", s2[i]?s2[i]:"" }
}' file1 file2

이것은 위의 내용을 완전히 문서화한 버전입니다.

# 2013-11-05 [email protected]
# Invoke thus:
#   awk -f this_file file1 file2
# The result is what you asked for and the columns will be
# determined by input file order.
#----------------------------------------------------------
# No matter which file we're reading,
# keep track of max line length for use
# in the printf format.
#
{ if ( length($0) > max ) max=length($0) }

# FNR is record number in current file
# NR is record number over all
# while they are equal, we're reading the first file
#   and we load the strings into array "s1"
#   and then go to the "next" line in the file we're reading.
FNR==NR { s1[FNR]=$0; next }

# and when they aren't, we're reading the
#   second file and we put the strings into
#   array s2
{s2[FNR]=$0}

# At the end, after all lines from both files have
# been read,
END {
  # use the max line length to create a printf format
  # the right widths
  format = "%-" max "s\t%-" max "s\n"
  # and figure the number of array elements we need
  # to cycle through in a for loop.
  numlines=(NR-FNR)>FNR?NR-FNR:FNR;
  for (i=1; i<=numlines; i++) {
     printf format, s1[i]?s1[i]:"", s2[i]?s2[i]:""
  }
}

답변3

데비안과 그 파생물에는 column다음이 있습니다.-n 노모가이빈 필드에서 열이 올바르게 작동하도록 허용하는 옵션입니다. 내부적으로는 와이드 문자열을 인수의 와이드 문자로 구분된 토큰 으로 분할하는 column이 함수가 사용됩니다.wcstok(wcs, delim, ptr)delim

wcstokdelim마크를 인식하기 전에 먼저 넓은 문자를 건너뛰십시오. 이 옵션 -n에서 사용되는 알고리즘은 건너뛰지 않습니다 delim.

불행하게도 이것은 이식성이 좋지 않습니다. -n이는 데비안 전용이고 columnPOSIX에는 없으며 분명히 BSD입니다.

답변4

패딩 포인트 제거:

파일 1:

ETIAM
SED
MAECENAS
DONEC
SUSPENDISSE

파일 2:

Lorem
Proin
Nunc
Quisque
Aenean
Nam
Vivamus
Curabitur
Nullam

이 시도:

$ ( echo ".TS"; echo "l l."; paste file1 file2; echo ".TE" ) | tbl | nroff | more

당신은 얻을 것이다:

ETIAM         Lorem
SED           Proin
MAECENAS      Nunc
DONEC         Quisque
SUSPENDISSE   Aenean
              Nam
              Vivamus
              Curabitur
              Nullam

관련 정보