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)