
私は複数のファイルのすべての必須データを列として出力するプログラムを開発しています。問題は、私のプログラムが複数の出力をきちんとした列に整列できないことです。
これは私のプログラム機能です。
#!/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の列コマンドを使用してリストの形式を指定します。