如何删除unix中每行末尾的字符

我想删除我的文件中每行的结尾处的逗号。 除了在awk使用substring函数,我怎么能做到这一点。 请给我build议。谢谢

示例input

  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, 

你可以使用sed:

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

并删除最后的字符:

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

尝试这样做:

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

这比通过删除最后一个逗号而不是最后一个字符更通用

如果你只想用awk删除最后一个逗号:

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

基于RSawk代码

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

要么:

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

最后一个例子在换行之前的任何字符都是有效的:

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

注意 . 匹配除换行符之外的任何字符。

说明

awk允许我们使用不同的logging(行) regex分隔符,我们只需要在用于inputRS (或任何字符的dot )之前包括逗号RS

注意 :那是什么意思?

简短的回答 ,这只是一个避免使用print语句的捷径。 在awk当条件匹配时,缺省操作是打印input行,例如:

 $ echo "test" |awk '1' test 

那是因为1总会是真的 ,所以这个expression式相当于:

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

文档

使用标准awk和输出分隔符 检查 logging拆分 。

执行相同工作的替代命令

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

这个Perl代码在行尾删除逗号:

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

如果逗号之后有空格,这个变化仍然有效:

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

这个变化在原地编辑文件:

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

这个变化在原地编辑文件,并做一个备份file.bak

 perl -i.bak -lpe 's/,\s*$//' file