我有一個源檔案.txt,我需要在目標檔案中生成和(他的內容)重新格式化。
這是我的源檔案:
TABLE;APGFPOLI;
Contrat;CHAR(16);Numéro du contrat
Libelle;CHAR(30);Libellé du contrat
DtCreation;CHAR(8);Date de création
DtMaj;CHAR(8);Date de dernière MAJ
DtEffet;CHAR(8);Date d'effet adhésion
MotifAdh;CHAR(2);Motif d'adhésion
DtRadiation;CHAR(8);Date de radiation
DtEnrRad;CHAR(8);Date enregistrement radiat
MotifRad;CHAR(2);Motif de radiation
MtPrime;Numérique 8.2;Montant prime d'origine
DtEffetSusp;CHAR(8);Date d'effet de suspension
DtFinSusp;CHAR(8);Date de fin de suspension
MotifSusp;CHAR(2);Motif de suspension
DestBord;CHAR(1);Destinataire du bordereau
CdDest;CHAR(5);Code du destinataire
NivRupBord;CHAR(1);Niveau rupture bordereau
BordCETIP;CHAR(1);Bordereau CTIP
EnvBordNom;CHAR(1);Envoi bordereau nominatif
Indice;CHAR(2);Indice appliqué
Echeance;CHAR(2);Echéance de l'indice (MM)
Effectif;CHAR(5);Effectif
CdRegr;CHAR(3);Code regroupement 1
CdGroupe;CHAR(3);Code regroupement 2
Periodicite;CHAR(1);Périodicité
Terme;CHAR(1);Terme
Produit;CHAR(6);Code produit affecté
Inspecteur;CHAR(5);Inspecteur
CleInsp;CHAR(1);Clé inspecteur
Filler;CHAR(6);Filler
這是我想要的輸出:
01 APGFPOLI.
* Numéro du contrat
05 Contrat PIC X(16).
* Libellé du contrat
05 Libelle PIC X(30).
* Date de création
05 DtCreation PIC X(8).
* Date de dernière MAJ
05 DtMaj PIC X(8).
* Date d'effet adhésion
05 DtEffet PIC X(8).
* Motif d'adhésion
05 MotifAdh PIC X(2).
* Date de radiation
05 DtRadiation PIC X(8).
* Date enregistrement radiat
05 DtEnrRad PIC X(8).
* Motif de radiation
05 MotifRad PIC X(2).
* Montant prime d'origine
05 MtPrime PIC 9(8).v9(2)..
* Date d'effet de suspension
05 DtEffetSusp PIC X(8).
* Date de fin de suspension
05 DtFinSusp PIC X(8).
* Motif de suspension
05 MotifSusp PIC X(2).
* Destinataire du bordereau
05 DestBord PIC X(1).
* Code du destinataire
05 CdDest PIC X(5).
* Niveau rupture bordereau
05 NivRupBord PIC X(1).
* Bordereau CTIP
05 BordCETIP PIC X(1).
* Envoi bordereau nominatif
05 EnvBordNom PIC X(1).
* Indice appliqué
05 Indice PIC X(2).
* Echéance de l'indice (MM).
05 Echeance PIC X(2).
* Effectif
05 Effectif PIC X(5).
* Code regroupement 1
05 CdRegr PIC X(3).
* Code regroupement 2
05 CdGroupe PIC X(3).
* Périodicité
05 Periodicite PIC X(1).
* Terme
05 Terme PIC X(1).
* Code produit affecté
05 Produit PIC X(6).
* Inspecteur
05 Inspecteur PIC X(5).
* Clé inspecteur
05 CleInsp PIC X(1).
* Filler
05 Filler PIC X(6).
所以作為 unix shell 的新手,我所做的是使用 sed 來做到這一點。但是當我將 sed 與 -i 選項一起使用時,它改變了我的源檔案,我絕對不想要那樣。所以我洗掉了它,但現在的問題是我的輸出不像我想要的那樣。
這是我的外殼:
#!/bin/bash
#Fichier Source
fichier="APGFPOLI.des.txt"
champAdd="05 "
firstAdd="01 "
if [[ -f "$fichier" ]]
then
# read it
sed "1s/TABLE/$firstAdd /" $fichier |sed 's/CHAR/PIC X/' $fichier | sed -E '/Numérique/s/;Numérique\s ([^;]*)/;PIC 9(\1)/' $fichier | while IFS=';' read -r nomChamp format libelle
do
echo \* $libelle
echo $nomChamp $format.
done > test.txt
fi
這是我的輸出:
*
TABLE APGFPOLI.
* Numéro du contrat
Contrat CHAR(16).
* Libellé du contrat
Libelle CHAR(30).
* Date de création
DtCreation CHAR(8).
* Date de dernière MAJ
DtMaj CHAR(8).
* Date d'effet adhésion
DtEffet CHAR(8).
* Motif d'adhésion
MotifAdh CHAR(2).
* Date de radiation
DtRadiation CHAR(8).
* Date enregistrement radiat
DtEnrRad CHAR(8).
* Motif de radiation
MotifRad CHAR(2).
* Montant prime d'origine
MtPrime PIC 9(8.2).
* Date d'effet de suspension
DtEffetSusp CHAR(8).
* Date de fin de suspension
DtFinSusp CHAR(8).
* Motif de suspension
MotifSusp CHAR(2).
* Destinataire du bordereau
DestBord CHAR(1).
* Code du destinataire
CdDest CHAR(5).
* Niveau rupture bordereau
NivRupBord CHAR(1).
* Bordereau CTIP
BordCETIP CHAR(1).
* Envoi bordereau nominatif
EnvBordNom CHAR(1).
* Indice appliqué
Indice CHAR(2).
* Echéance de l'indice (MM)
Echeance CHAR(2).
* Effectif
Effectif CHAR(5).
* Code regroupement 1
CdRegr CHAR(3).
* Code regroupement 2
CdGroupe CHAR(3).
* Périodicité
Periodicite CHAR(1).
* Terme
Terme CHAR(1).
* Code produit affecté
Produit CHAR(6).
* Inspecteur
Inspecteur CHAR(5).
* Clé inspecteur
CleInsp CHAR(1).
如您所見,首先是我的 sed 更改不在此處,并且輸出缺少源檔案的最后一行。我現在一直在想一種方法來實作我想要的。
uj5u.com熱心網友回復:
如果$fichier為sed它指定一個輸入檔案 ( )將不會從中讀取stdin,因此在sed使用時第一個命令的結果將被忽略
sed "1s/TABLE/$firstAdd /" $fichier |sed 's/CHAR/PIC X/' $fichier | ...
利用
sed "1s/TABLE/$firstAdd /" "$fichier" |sed 's/CHAR/PIC X/' | sed -E '/Numérique/s/;Numérique\s ([^;]*)/;PIC 9(\1)/' | ...
或為一次呼叫指定多個命令 sed
sed -E -e "1s/TABLE/$firstAdd /" -e 's/CHAR/PIC X/' -e '/Numérique/s/;Numérique\s ([^;]*)/;PIC 9(\1)/' "$fichier" | ...
使用awk.
awk -F ';' '$1=="TABLE" && $3=="" {printf "01 %s.\n\n", $2; next} {sub(/CHAR/,"PIC X", $2);printf " * %s.\n\n 05 %s %s.\n\n", $3, $1, $2;}' APGFPOLI.des.txt > test.txt
解釋:
-F ';'欄位分隔符;$1=="TABLE" && $3==""檢測TABLE線。替代方法:檢查記錄號 1 (FNR==1)printf "01 %s.\n\n", $2格式化輸出next跳過對該記錄的進一步處理。避免下一個命令的條件。sub(/CHAR/,"PIC X", $2)代替CHARprintf " * %s.\n\n 05 %s %s.\n\n", $3, $1, $2格式化輸出。
如有必要,您可以為01和添加變數05。
awk -F ';' -v 'champAdd=05' -v 'firstAdd=01' '$1=="TABLE" && $3=="" {printf "%s %s.\n\n", firstAdd, $2; next} {sub(/CHAR/,"PIC X", $2);printf " * %s.\n\n %s %s %s.\n\n", $3, champAdd, $1, $2;}' APGFPOLI.des.txt > test.txt
awk上面的解決方案不會替換 string Numérique ...。
以下命令包含此命令,但awk由于該gensub命令僅適用于 GNU 。如果沒有此命令,則需要更多代碼來進行替換,以防后面的數字Numérique可能有所不同。對于常數,使用一個sub命令可以很容易地將一個確切的字串替換為另一個字串。
awk -F ';' -v 'champAdd=05' -v 'firstAdd=01' '$1=="TABLE" && $3=="" {printf "%s %s.\n\n", firstAdd, $2; next} {sub(/CHAR/,"PIC X", $2);$2=gensub(/Numérique ([0-9]*)\.([0-9]*)/,"PIC 9(\\1).v9(\\2)",1,$2);printf " * %s.\n\n %s %s %s.\n\n", $3, champAdd, $1, $2;}' APGFPOLI.des.txt > test.txt
(您可以gensub在沒有變數champAdd等的腳本版本中使用相同的命令。)
uj5u.com熱心網友回復:
這可能對你有用(GNU sed):
sed -E '1{s/.*;(.*);/01 \1./;b}
s/(.*);CHAR(.*);(.*)/\n * \3\n\n 05 \1 PIC X\2./
s/(.*);Numérique (.*)\.(.*);(.*)/\n * \4\n\n 05 \1 PIC 9(\2).v9(\3)./' file
模式匹配并格式化對所需輸出的反向參考。
uj5u.com熱心網友回復:
使用 sed
$ cat sed.script
1s/[^;]*;\([^;]*\)\?;\?\(.*\)/01 \1/
2,$s/\([^;]*\);[^(]*\(.[0-9]*)\);\(.*\)/\t*\3\n\t05 \1 PIC X\2/
s/\([^;]*\)[^0-9]*\([0-9]*\)\.\([0-9]*\);\(.*\)/\t*\4\n\t05 \1 PIC 9(\2).v9(\3)/
呼叫腳本
$ sed -f sed.script input_file > test.txt
或作為單襯
$ sed '1s/[^;]*;\([^;]*\)\?;\?\(.*\)/01 \1/;2,$s/\([^;]*\);[^(]*\(.[0-9]*)\);\(.*\)/\t*\3\n\t05 \1 PIC X\2/;s/\([^;]*\)[^0-9]*\([0-9]*\)\.\([0-9]*\);\(.*\)/\t*\4\n\t05 \1 PIC 9(\2).v9(\3)/' input_file > test.txt
輸出
$ sed -f sed.script input_file
01 APGFPOLI
*Numéro du contrat
05 Contrat PIC X(16)
*Libellé du contrat
05 Libelle PIC X(30)
*Date de création
05 DtCreation PIC X(8)
*Date de dernière MAJ
05 DtMaj PIC X(8)
*Date d'effet adhésion
05 DtEffet PIC X(8)
*Motif d'adhésion
05 MotifAdh PIC X(2)
*Date de radiation
05 DtRadiation PIC X(8)
*Date enregistrement radiat
05 DtEnrRad PIC X(8)
*Motif de radiation
05 MotifRad PIC X(2)
*Montant prime d'origine
05 MtPrime PIC 9(8).v9(2)
*Date d'effet de suspension
05 DtEffetSusp PIC X(8)
*Date de fin de suspension
05 DtFinSusp PIC X(8)
*Motif de suspension
05 MotifSusp PIC X(2)
*Destinataire du bordereau
05 DestBord PIC X(1)
*Code du destinataire
05 CdDest PIC X(5)
*Niveau rupture bordereau
05 NivRupBord PIC X(1)
*Bordereau CTIP
05 BordCETIP PIC X(1)
*Envoi bordereau nominatif
05 EnvBordNom PIC X(1)
*Indice appliqué
05 Indice PIC X(2)
*Echéance de l'indice (MM)
05 Echeance PIC X(2)
*Effectif
05 Effectif PIC X(5)
*Code regroupement 1
05 CdRegr PIC X(3)
*Code regroupement 2
05 CdGroupe PIC X(3)
*Périodicité
05 Periodicite PIC X(1)
*Terme
05 Terme PIC X(1)
*Code produit affecté
05 Produit PIC X(6)
*Inspecteur
05 Inspecteur PIC X(5)
*Clé inspecteur
05 CleInsp PIC X(1)
*Filler
05 Filler PIC X(6)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/387052.html
