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

如何在UNIX中删除每行末尾的字符,unix,awk,sed,Unix,Awk,Sed,我想删除文件中每行末尾的逗号,。除了在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,

我想删除文件中每行末尾的逗号
。除了在
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,
您可以使用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

此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

基于
RS
awk
代码

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

最后一个示例适用于换行之前的任何字符:

注意:点
匹配除换行符以外的任何字符

解释

awk
允许我们使用不同的记录(行)
regex
分隔符,我们只需要在
输入
中的
RS
中包含换行符之前的逗号(或

awk '1' RS=',\n' file
注意:这是什么意思

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

$ echo "test" |awk '1'
test
这是因为
1
将始终为true,因此此表达式等效于:

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


检查并。

除了将输出发送到新文件,您还可以将-i开关附加到sed,将i写入'file'@ubuntu101010101,但使用此选项可能会触发
sed
错误。问题被标记为Unix。使用非POSIX GNUism会使我的建议不可移植。我只是在尝试类似的东西,出于某种原因,您需要一个
长度($0)
,而不需要
-1
。。。这对我来说似乎也没什么意义。但不管怎样,只要它能工作,它就是bash。我之所以这么做,是因为我能够将
ls
的输出通过管道传输到第二条语句中,并去掉一个特定的文件扩展名。其他一些答案可能也适用于这一点,但这一个对我来说更容易阅读,同时保持简洁。
$ echo "test"|awk '1==1'
test
$ echo "test"|awk '{if (1==1){print}}'
test