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,
Vous pouvez utiliser sed:
sed 's/,$//' file > file.nocomma
et enlever n'importe quel dernier caractère:
sed 's/.$//' file > file.nolast
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
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 .
commandes alternatives qui font le même travail
tr -d ",$" < infile
awk 'gsub(",$","")' infile
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