使用awk命令加入带分隔符的文件

时间:2014-05-15 13:25:40

标签: shell awk

我已经写了这段代码

for fichier in $(find $DATA $ARCH -type f -mtime $histo)
do
    compteur_lignes=$(cat $fichier|wc -l)
    echo "Nombre de lignes : $compteur_lignes"
      quantieme_f=$(date -r $fichier +%j)
    echo "Quantieme fichier : $quantieme_f"
    nom_fichier=$(basename $fichier)
    echo $nom_fichier
    awk -vquant_f=$quantieme_f -vtype_f='' -vNB_LG=$compteur_lignes -vnom_fic=$nom_fichier '{ if ( $1 == 01 ) {type_f=substr($0,21,7);printf "\n - Type %s, Quantième du jour de réception %s, Nombre de lignes du fichier %s, Nom du fichier %s\n" , type_f, quant_f, NB_LG, nom_fic}}' ${fichier} >> ${MAIL_CORP}
done

输出就像那样:

 - Type TYPEN1, Quantième du jour de réception 126, Nombre de lignes du fichier 6, Nom du fichier Test.txt

我需要在第一列上使用分隔文件进行连接:

TYPEN1:TRANSCON1
TYPEN2:TRANSCON2
TYPEN3:TRANSCON3
TYPEN4:TRANSCON4

最后得到这个输出:

 - Type TYPEN1 (TRANSCON1), Quantième du jour de réception 126, Nombre de lignes du fichier 6, Nom du fichier Test.txt

我该怎么做?

2 个答案:

答案 0 :(得分:1)

假设您的循环输出为a且文件为b,则

awk -F: 'NR==FNR { split($0,a,","); next }
         { 
           s= a[1] " (" $2 ")"
           for(i=2; i<=length(a); ++i) s=s "," a[i]
           print s
         }' a b

一次处理两行输入。第一个块在第一个输入上执行(因为NR==FNR),next跳到下一个输入。第二个块将第二个输入的部分夹在第一个输入中。

输出:

 - Type TYPEN1 (TRANSCON1), Quantième du jour de réception 126, Nombre de lignes du fichier 6, Nom du fichier Test.txt

这里有一个假设,来自两个输入的行将按正确的顺序排列(使用sort很容易修复)并且不会丢失任何行。如果这是一个问题,请告诉我。

答案 1 :(得分:1)

这个awk可以为你工作:

awk 'FNR==NR{if (split($0,t,":")) a[t[1]]=t[2]; next} {for (i=1; i<=NF; i++) 
     {f=$i; gsub(/,/, "", f); if (f in a) $i=f " (" a[f] "),"} print }' f1 f2
- Type TYPEN1 (TRANSCON1), Quantième du jour de réception 126, Nombre de lignes du fichier 6, Nom du fichier Test.txt