web-dev-qa-db-fra.com

Comment supprimer un caractère à la fin de chaque ligne sous unix

J'aimerais supprimer la virgule , à la fin de chaque ligne de mon fichier. Comment puis-je le faire autrement qu'en utilisant la fonction de sous-chaîne dans awk. s'il vous plaît me suggérer.Merci

Exemple de saisie

        SUPPLIER_PROC_ID BIGINT NOT NULL,
        BTCH_NBR INTEGER NOT NULL,
        RX_BTCH_SUPPLIER_SEQ_NBR INTEGER NOT NULL,
        CORRN_ID INTEGER NOT NULL,
        RX_CNT BYTEINT NOT NULL,
        DATA_TYP_CD BYTEINT NOT NULL,
        DATA_PD_CD BYTEINT NOT NULL,
        CYC_DT DATE NOT NULL,
        BASE_DT DATE NOT NULL,
        DATA_LOAD_DT DATE NOT NULL,
        DATA_DT DATE NOT NULL,
        SUPPLIER_DATA_SRC_CD BYTEINT NOT NULL,
        RX_CHNL_CD BYTEINT NOT NULL,
        MP_IMS_ID INTEGER NOT NULL,
        MP_LOC_ID NUMERIC(3,0),
        MP_IMS_ID_ACTN_CD BYTEINT NOT NULL,
        NPI_ID BIGINT,
49
Teja

Vous pouvez utiliser sed:

sed 's/,$//' file > file.nocomma

et enlever n'importe quel dernier caractère:

sed 's/.$//' file > file.nolast
47
jlliagre

Essayez de faire ceci:

awk '{print substr($0, 1, length($0)-1)}' file.txt

C’est plus générique que de simplement supprimer la virgule finale, mais n’importe quel dernier caractère.

Si vous souhaitez supprimer uniquement la dernière virgule avec awk:

awk '{gsub(/,$/,""); print}' file.txt
74
Gilles Quenot

Un code awk basé sur RS.

awk '1' RS=',\n' file

ou:

awk 'BEGIN{RS=",\n"}1' file

Ce dernier exemple sera valable pour any char avant newline:

awk '1' RS='.\n' file

Note: point. correspond à tous les caractères sauf sauts de ligne.

Explication

awk nous permet d'utiliser différents séparateurs record (ligne) regex, il suffit d'inclure la virgule avant le saut de ligne (ou dot pour tout char) dans celui utilisé pour le input , la RS.

Note: qu'est-ce que 1 signifie?

Réponse courte, Il s'agit simplement d'un raccourci pour éviter d'utiliser l'instruction print . Dans awk lorsqu'une condition est remplie, l'action par défaut consiste à imprimer la ligne de saisie, exemple:

$ echo "test" |awk '1'
test

En effet, 1 sera toujours true, cette expression est donc équivalente à:

$ echo "test"|awk '1==1'
test
$ echo "test"|awk '{if (1==1){print}}'
test

Documentation 

VérifierFractionnement d'enregistrement avec des séparateurs de sortie awk et standard .

6
klashxx

commandes alternatives qui font le même travail 

tr -d ",$" < infile
awk 'gsub(",$","")' infile
1
SHAILESH PATEL

Ce code Perl supprime les virgules à la fin de la ligne:

Perl -pe 's/,$//' file > file.nocomma

Cette variante fonctionne toujours s'il y a des espaces après la virgule:

Perl -lpe 's/,\s*$//' file > file.nocomma

Cette variante édite le fichier sur place:

Perl -i -lpe 's/,\s*$//' file

Cette variante édite le fichier sur place et crée une sauvegarde file.bak:

Perl -i.bak -lpe 's/,\s*$//' file
0
Chris Koknat