通过向源文件添加字符串来使用源文件的内容创建目标文件
Create a target file using the contents of a source file by adding strings to it
我有一个来源 file.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 shells 的新手,我所做的就是使用 sed 来做到这一点。但是,当我将 sed 与 -i 选项一起使用时,它更改了我的源文件,我绝对不希望这样。所以我删除了它,但现在的问题是我的输出不像我想要的那样。
这是我的 shell :
#!/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()/' $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 更改不在这里,并且输出缺少源文件的最后一行。我现在一直在想办法实现我想要的。
这可能对你有用 (GNU sed):
sed -E '1{s/.*;(.*);/01 ./;b}
s/(.*);CHAR(.*);(.*)/\n * \n\n 05 PIC X./
s/(.*);Numérique (.*)\.(.*);(.*)/\n * \n\n 05 PIC 9().v9()./' file
模式匹配并将反向引用格式化为所需的输出。
如果您为 sed
指定输入文件 ($fichier
),它将不会从 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()/' | ...
或为 sed
的一次调用指定多个命令
sed -E -e "1s/TABLE/$firstAdd /" -e 's/CHAR/PIC X/' -e '/Numérique/s/;Numérique\s+([^;]*)/;PIC 9()/' "$fichier" | ...
使用 awk
可能更容易实现。
awk -F ';' '=="TABLE" && =="" {printf "01 %s.\n\n", ; next} {sub(/CHAR/,"PIC X", );printf " * %s.\n\n 05 %s %s.\n\n", , , ;}' APGFPOLI.des.txt > test.txt
解释:
-F ';'
字段分隔符 ;
=="TABLE" && ==""
检测 TABLE
行。备选方案:检查记录号 1 (FNR==1
)
printf "01 %s.\n\n",
格式化输出
next
跳过对该记录的进一步处理。避免下一个命令的条件。
sub(/CHAR/,"PIC X", )
替换 CHAR
printf " * %s.\n\n 05 %s %s.\n\n", , ,
格式化输出。
如有必要,您可以为 01
和 05
添加变量。
awk -F ';' -v 'champAdd=05' -v 'firstAdd=01' '=="TABLE" && =="" {printf "%s %s.\n\n", firstAdd, ; next} {sub(/CHAR/,"PIC X", );printf " * %s.\n\n %s %s %s.\n\n", , champAdd, , ;}' APGFPOLI.des.txt > test.txt
上面的awk
解决方案不会替换字符串Numérique ...
.
以下命令包含此内容,但由于 gensub
命令仅适用于 GNU awk
。如果没有此命令,则需要更多代码来进行替换,以防 Numérique
之后的数字可能发生变化。对于常数,使用一个 sub
命令可以很容易地将一个确切的字符串替换为另一个字符串。
awk -F ';' -v 'champAdd=05' -v 'firstAdd=01' '=="TABLE" && =="" {printf "%s %s.\n\n", firstAdd, ; next} {sub(/CHAR/,"PIC X", );=gensub(/Numérique ([0-9]*)\.([0-9]*)/,"PIC 9(\1).v9(\2)",1,);printf " * %s.\n\n %s %s %s.\n\n", , champAdd, , ;}' APGFPOLI.des.txt > test.txt
(您可以在不带变量的脚本版本中使用相同的 gensub
命令 champAdd
等)
我有一个来源 file.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 shells 的新手,我所做的就是使用 sed 来做到这一点。但是,当我将 sed 与 -i 选项一起使用时,它更改了我的源文件,我绝对不希望这样。所以我删除了它,但现在的问题是我的输出不像我想要的那样。
这是我的 shell :
#!/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()/' $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 更改不在这里,并且输出缺少源文件的最后一行。我现在一直在想办法实现我想要的。
这可能对你有用 (GNU sed):
sed -E '1{s/.*;(.*);/01 ./;b}
s/(.*);CHAR(.*);(.*)/\n * \n\n 05 PIC X./
s/(.*);Numérique (.*)\.(.*);(.*)/\n * \n\n 05 PIC 9().v9()./' file
模式匹配并将反向引用格式化为所需的输出。
如果您为 sed
指定输入文件 ($fichier
),它将不会从 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()/' | ...
或为 sed
sed -E -e "1s/TABLE/$firstAdd /" -e 's/CHAR/PIC X/' -e '/Numérique/s/;Numérique\s+([^;]*)/;PIC 9()/' "$fichier" | ...
使用 awk
可能更容易实现。
awk -F ';' '=="TABLE" && =="" {printf "01 %s.\n\n", ; next} {sub(/CHAR/,"PIC X", );printf " * %s.\n\n 05 %s %s.\n\n", , , ;}' APGFPOLI.des.txt > test.txt
解释:
-F ';'
字段分隔符;
=="TABLE" && ==""
检测TABLE
行。备选方案:检查记录号 1 (FNR==1
)printf "01 %s.\n\n",
格式化输出next
跳过对该记录的进一步处理。避免下一个命令的条件。sub(/CHAR/,"PIC X", )
替换CHAR
printf " * %s.\n\n 05 %s %s.\n\n", , ,
格式化输出。
如有必要,您可以为 01
和 05
添加变量。
awk -F ';' -v 'champAdd=05' -v 'firstAdd=01' '=="TABLE" && =="" {printf "%s %s.\n\n", firstAdd, ; next} {sub(/CHAR/,"PIC X", );printf " * %s.\n\n %s %s %s.\n\n", , champAdd, , ;}' APGFPOLI.des.txt > test.txt
上面的awk
解决方案不会替换字符串Numérique ...
.
以下命令包含此内容,但由于 gensub
命令仅适用于 GNU awk
。如果没有此命令,则需要更多代码来进行替换,以防 Numérique
之后的数字可能发生变化。对于常数,使用一个 sub
命令可以很容易地将一个确切的字符串替换为另一个字符串。
awk -F ';' -v 'champAdd=05' -v 'firstAdd=01' '=="TABLE" && =="" {printf "%s %s.\n\n", firstAdd, ; next} {sub(/CHAR/,"PIC X", );=gensub(/Numérique ([0-9]*)\.([0-9]*)/,"PIC 9(\1).v9(\2)",1,);printf " * %s.\n\n %s %s %s.\n\n", , champAdd, , ;}' APGFPOLI.des.txt > test.txt
(您可以在不带变量的脚本版本中使用相同的 gensub
命令 champAdd
等)