저는 여러 파일의 모든 필수 데이터를 열로 출력하는 프로그램을 개발 중입니다. 문제는 내 프로그램이 여러 출력을 깔끔한 열로 정렬할 수 없다는 것입니다.
이것은 내 프로그램 기능입니다.
#!/bin/sh
function findFile
{
while read -r LINE
do
find . -name "${LINE}" | grep "${LINE}" || echo "${LINE} not found"
done < /path/to/fnames.txt > /path/to/Files.txt
}
findFile
function grepFile
{
printf "ISA\t\tGS\tTrans\tSender ID\tReceiver ID\tINV PO Number\tASN PO Number\n"
fmt="%-16s%-8s%-8s%-8s%-24s%-9s%-12s\n"
while read -r LINE
do
gs=$(zgrep -oP 'GS.[^*]*.[^*]*.[^*]*.[^*]*.[^*]*.\K[\w\s\d]*' < $LINE | sort -u)
isa=$(zgrep -oP 'ISA.[^*]*.[^*]*.[^*]*.[^*]*.[^*]*.[^*]*.[^*]*.[^*]*.[^*]*.[^*]*.[^*]*.[^*]*.\K[\w\s\d]*' < $LINE | sort)
trans=$(zgrep -oP 'GE.\K[\w\s\d-]*' < $LINE | sort -u)
sender=$(zgrep -oP 'ISA.[^*]*.[^*]*.[^*]*.[^*]*.[^*]*.\K[\w\s\d-]*' < $LINE | sort -u)
receiver=$(zgrep -oP 'ISA.[^*]*.[^*]*.[^*]*.[^*]*.[^*]*.[^*]*.[^*]*.\K[\w\s\d-]*' < $LINE | sort -u)
bigponumber=$(zgrep -oP 'BIG.[\w\s\d-]*.[\w\s\d]*.[\w\s\d]*.\K[\w\s\d-]*' < $LINE | sort -u)
asnponumber=$(zgrep -oP 'PRF.\K[\w\s\d-]*' < $LINE | sort -u)
printf "$fmt" "${isa}" "${gs}" "${trans}" "${sender}" "${receiver}" "${bigponumber}" "${asnponumber}"
done < /path/to/Files.txt
rm /path/to/Files.txt
}
grepFile
출력: 화면 왼쪽에 있는 숫자를 보셨나요? 구매주문번호입니다.
ISA GS Trans Sender ID Receiver ID INV PO Number ASN PO Number
100000107 1107 1 2035735845 AMAZON 2IJW4EUG
100000018 1018 1 00116520M 5032337598 0082313829
100000096 1096 7 001165208 6111470100 0026-7684347-0551
0026-7684347-0557
0026-7684347-0580
0026-7684347-0587
0026-7684347-0589
0026-7684347-3803
0026-7684347-3804
100000580 1580 6 2035735845 TGTDVS 1310548379
1310570020
1310590953
1310596065
1310598477
1310609258
나는 다음과 같이 보이기를 원합니다. INV PO 번호도 마찬가지입니다.
ISA GS Trans Sender ID Receiver ID INV PO Number ASN PO Number
100000107 1107 1 2035735845 AMAZON 2IJW4EUG
100000018 1018 1 00116520M 5032337598 0082313829
100000096 1096 7 001165208 6111470100 0026-7684347-0551
0026-7684347-0557
0026-7684347-0580
0026-7684347-0587
0026-7684347-0589
0026-7684347-3803
0026-7684347-3804
100000580 1580 6 2035735845 TGTDVS 1310548379
1310570020
1310590953
1310596065
1310598477
1310609258
답변1
다음과 같이 이 작업을 수행할 수 있습니다.
grepFile | column -t -s $'\t' -o $'\t'
내가 제시한 제안에 따라 grepFile 함수가 수정되었다고 가정해 보겠습니다.
"alignCols"와 같은 다른 사용자 정의 함수를 생성하고 "grepFile" 함수의 출력을 전달합니다.
또한 명령문에서 "grepFile" 함수를 약간 수정합니다 printf
.
function grepFile
{
#*************** ADD THIS ********
t=$'\t'; # TAB char
#*********************************
printf "ISA\t\tGS\tTrans\tSender ID\tReceiver ID\tINV PO Number\tASN PO Number\n"
#*************** MODIFY THIS ********
fmt="%s\t%s\t%s\t%s\t%s\t%s\t%s\n"
#*********************************
while read -r LINE
do
# ... keep the other statements just like before #
# ************** MODIFY printf ****************
printf "$fmt" \
"${isa:-$t}" \
"${gs:-$t}" \
"${trans:-$t}" \
"${sender:-$t}" \
"${receiver:-$t}" \
"${bigponumber:-$t}" \
"${asnponumber:-$t}";
# *********************************************
done < /path/to/Files.txt
rm /path/to/Files.txt
}
function alignCols
{
sed -e '
1i\
.TS\
tab('$'\t'');\
l l l l l l l.
$a\
.TE
' - | tbl - | nroff -Tascii -ms | grep .
}
# And then...
grepFile | alignCols
결과
ISA GS Trans Sender ID Receiver ID INV PO Number ASN PO Number
100000107 1107 1 2035735845 AMAZON 2IJW4EUG
100000018 1018 1 00116520M 5032337598 0082313829
100000096 1096 7 001165208 6111470100 0026-7684347-0551
0026-7684347-0557
0026-7684347-0580
0026-7684347-0587
0026-7684347-0589
0026-7684347-3803
0026-7684347-3804
100000580 1580 6 2035735845 TGTDVS 1310548379
1310570020
1310590953
1310596065
1310598477
답변2
여기서 핵심은 컬럼 프로그램 cf를 사용하는 것입니다.사람 1 열
구분 기호 정의와 같은 몇 가지 간단한 옵션을 사용하여 필요에 따라 데이터를 정렬할 수 있습니다.
이 질문을 살펴볼 수도 있습니다. *nix에서 열 명령을 사용하여 목록 형식을 지정합니다.