67

我想删除,文件中每一行末尾的逗号。除了在中使用子字符串函数之外,我还能怎么做awk

样本输入:

        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,
4

4 回答 4

86

尝试这样做:

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

这比仅仅删除最后一个逗号而是任何最后一个字符更通用

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

awk '{gsub(/,$/,""); print}' file.txt
于 2013-02-12T20:14:47.653 回答
68

您可以使用 sed:

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

并删除最后一个字符:

sed 's/.$//' file > file.nolast
于 2013-02-12T20:14:08.147 回答
7

基于的awk代码RS

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

或者:

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

最后一个示例对newline之前的任何 char都有效:

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

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

解释

awk允许我们使用不同的记录(行)分隔符,我们只需要在换行符(或任何字符)regex之前包含逗号,用于.dotinputRS

注意:这是什么1意思?

简短的回答,这只是避免使用该print语句的捷径。当awk条件匹配时,默认操作是打印输入行,例如:

$ echo "test" |awk '1'
test

那是因为1will 总是true,所以这个表达式等价于:

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

文档

Check Record Splitting with Standard awk and Output Separators.

于 2015-12-09T22:46:55.793 回答
0

此 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
于 2015-10-07T16:45:23.077 回答