如何在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