일부 논리를 기반으로 일부 데이터를 생성한 다음 일부 조합으로 출력을 표시하는 루프에서 스크립트를 실행하고 있지만, 내가 얻은 출력은 새 줄에 있습니다.
Roll number : 187437366
Mobile Number : 07995036927
Grade : A
Roll number : 187437367
Mobile Number : 07995036937
Grade : B
하지만 아래와 같이 표 형식으로 출력을 원합니다.
Roll Number | Mobile Number | Grade
187437366 | 07995036927 | A
187437466 | 07995037922 | A2
187437266 | 07995036921 | B
187437766 | 07995036120 | C
이것을 달성하는 방법에 대한 개념을 찾을 수 없습니다. 누구든지 나를 도와줄 수 있습니까?
답변1
awk
물론 도구 상자에 이 도구만 있는 것은 아닙니다. 불가피하게 쏟아지는 스크립트의 균형을 맞추기 위해 awk
여기에 있습니다.밀러실행 중:
%mlr --ixtab --ips : --opprint 고양이 << END 롤 번호: 187437366 휴대폰 번호 : 07995036927 A 급 롤 번호: 187437367 휴대폰 번호 : 07995036937 학년: B 끝 롤번호 휴대폰 번호 수준 187437366 07995036927A 187437367 07995036937B %
스크립트에서 각 레코드 뒤에 빈 줄을 내보내도록 하거나 이를 수행하기 위해 중간 필터를 추가하면 "XTAB" 입력 형식과 :
"쌍 구분 기호" 문자만 있으면 됩니다( --ixtab
및 --ips
옵션 참조).
위의 내용은 "PPRINT" 출력 형식입니다. 더 많은 질문과 같은 출력을 위해 --barred
"PPRINT" 및 "Markdown" 대체 출력 형식을 선택할 수 있습니다 --omd
. 그러나 나는 최신 버전의 Miller를 시연용으로 즉시 제공하지 않았습니다.
답변2
짧막 한 농담:
$ awk -F':' '{printf "%s%s", $2, (/^Grade/)?"\n":"\t|"}' file
산출:
187437366 | 07995036927 | A
187437367 | 07995036937 | B
답변3
awk
탭 및 구분 기호로 사용 |
:
awk -F: '
BEGIN{ printf "%s\t|%s\t|%s","Roll Number","Mobile Number","Grade"}
{ gsub(/ /,"",$2); printf "%s", ($1 ~ "^Roll" ? RS : "\t|") $2 }
END { print "" }
' file
블록 내에서 탭을 사용하고 BEGIN
각 필드 사이에 제목을 인쇄하세요. 그런 다음 두 번째 필드(선행 및 후행)에서 모든 공백 문자를 제거하고|
- 첫 번째 필드가 로 시작하는 경우
Roll
레코드 구분 기호RS
(개행)를 추가하고, 그렇지 않으면 탭 및|
- 두 번째 필드 인쇄
END
블록 내에서 또 다른 개행 문자를 인쇄합니다.
산출:
Roll Number |Mobile Number |Grade
187437366 |07995036927 |A
187437367 |07995036937 |B
답변4
코드를 입력 파일의 데이터 값에 연결하는 대신 반복되는 헤더 값에만 의존하십시오.
$ cat tst.awk
BEGIN {
FS = "[[:space:]]*:[[:space:]]*"
OFS = "|"
}
seen[$1]++ { prt() }
{
hdrs[++numFlds] = $1
vals[numFlds] = $2
}
END { prt() }
function prt( fldNr) {
if ( !doneHdr++ ) {
for (fldNr=1; fldNr<=numFlds; fldNr++) {
printf "%s%s", hdrs[fldNr], (fldNr<numFlds ? OFS : ORS)
}
}
for (fldNr=1; fldNr<=numFlds; fldNr++) {
printf "%s%s", vals[fldNr], (fldNr<numFlds ? OFS : ORS)
}
numFlds = 0
delete seen
}
.
$ awk -f tst.awk file | column -s'|' -o' | ' -t
Roll number | Mobile Number | Grade
187437366 | 07995036927 | A
187437367 | 07995036937 | B