我正在尝试修改CSV文件以将值附加到行A
。我的条件正则表达式是,$
,其中$
是最后一个字符。
我的sed 's/,$/,A/'
不会返回任何更改。
但是,sed 's/$/########/'
用替换字符串替换每行的前N个字符。
示例:
user@HOST:/loc/yearly_files$ head merged19.csv
1900-01-01 09:00, 2084, DCNN, DLY3208, 1, 310, 1011, , , , , , , , 5, , , , , , , , , , , , , , , , , , , , , 1.1, , 0, , , , , , , , , , , , , 1, , , , , , , , 1, , 1, , , , , , , , , , , , , , , , , , , , , , , , , , , D, , , , D, , D, , , , , 79, A, ,
1900-01-01 09:00, 3197, DCNN, DLY3208, 1, 449, 1001, , , , , , , , 4, , , , , , , , , , , , , , , , , , , , , 4.7, , 4.3, , , , , , , , , , , , , 0, , , , , , , , 0, , 0, , , , , , , , , , , , , , , , , , , , , , , , , , , D, , , , B, , B, , , , , 93.6, A, ,
1900-01-01 09:00, 4813, DCNN, DLY3208, 1, 653, 1001, , , , , , , , 4, , , , , , , , , , , , , , , , , , , , , 2.3, , 1.7, , , , , , , , , , , , , 0, , , , , , , , 0, , 0, , , , , , , , , , , , , , , , , , , , , , , , , , , D, , , , B, , B, , , , , 89.2, A, ,
1900-01-01 09:00, 4967, DCNN, DLY3208, 1, 687, 1001, , , , , , , , 8, , , , , , , , , , , , , , , , , , , , , 3.2, , 2.8, , , , , , , , , , , , , 0, , , , , , , , 0, , 0, , , , , , , , , , , , , , , , , , , , , , , , , , , D, , , , B, , B, , , , , 93, A, ,
1900-01-01 09:00, 5399, DCNN, DLY3208, 1, 778, 1001, , , , , , , , 8, , , , , , , , , , , , , , , , , , , , , 5.8, , 5.7, , , , , , , , , , , , , 0, , , , , , , , 0, , 0, , , , , , , , , , , , , , , , , , , , , , , , , , , D, , , , B, , B, , , , , 98.5, A, ,
1900-01-01 09:00, 6950, DCNN, DLY3208, 1, 1047, 1011, , , , , , , , 6, , , , , , , , , , , , , , , , , , , , , 6.1, , 5.1, , , , , , , , 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, , , , , , , , , , H, , , , B, , B, , , , , 84.8, A, ,
1900-01-01 09:00, 7384, DCNN, DLY3208, 1, 1136, 1001, , , , , , , , 4, , , , , , , , , , , , , , , , , , , , , 2.3, , 1.7, , , , , , , , , , , , , 0, , , , , , , , 0, , 0, , , , , , , , , , , , , , , , , , , , , , , , , , , D, , , , B, , B, , , , , 89.2, A, ,
1900-01-01 21:00, 2084, DCNN, DLY3208, 1, 310, 1011, , , , , , , , 8, , , , , , , , , , , , , , , , , , , , , -.6, , -.6, , , , , , , , , , , , , 1, , , , , , , , 1, , 1, , , , , , , , , , , , , , , , , , , , , , , , , , , D, , , , D, , D, , , , , 99.3, A, ,
1900-01-01 21:00, 3197, DCNN, DLY3208, 1, 449, 1001, , , , , , , , 8, , , , , , , , , , , , , , , , , , , , , 5.7, , 5.6, , , , , , , , , , , , , 0, , , , , , , , 0, , 0, , , , , , , , , , , , , , , , , , , , , , , , , , , D, , , , B, , B, , , , , 98.5, A, ,
1900-01-01 21:00, 4967, DCNN, DLY3208, 1, 687, 1001, , , , , , , , 8, , , , , , , , , , , , , , , , , , , , , 5.3, , 4.9, , , , , , , , , , , , , 0, , , , , , , , 0, , 0, , , , , , , , , , , , , , , , , , , , , , , , , , , D, , , , B, , B, , , , , 93.6, A, ,
user@HOST:/loc/yearly_files$ head merged19.csv | sed "s/$/,NULL/"
,NULL01-01 09:00, 2084, DCNN, DLY3208, 1, 310, 1011, , , , , , , , 5, , , , , , , , , , , , , , , , , , , , , 1.1, , 0, , , , , , , , , , , , , 1, , , , , , , , 1, , 1, , , , , , , , , , , , , , , , , , , , , , , , , , , D, , , , D, , D, , , , , 79, A, ,
,NULL01-01 09:00, 3197, DCNN, DLY3208, 1, 449, 1001, , , , , , , , 4, , , , , , , , , , , , , , , , , , , , , 4.7, , 4.3, , , , , , , , , , , , , 0, , , , , , , , 0, , 0, , , , , , , , , , , , , , , , , , , , , , , , , , , D, , , , B, , B, , , , , 93.6, A, ,
,NULL01-01 09:00, 4813, DCNN, DLY3208, 1, 653, 1001, , , , , , , , 4, , , , , , , , , , , , , , , , , , , , , 2.3, , 1.7, , , , , , , , , , , , , 0, , , , , , , , 0, , 0, , , , , , , , , , , , , , , , , , , , , , , , , , , D, , , , B, , B, , , , , 89.2, A, ,
,NULL01-01 09:00, 4967, DCNN, DLY3208, 1, 687, 1001, , , , , , , , 8, , , , , , , , , , , , , , , , , , , , , 3.2, , 2.8, , , , , , , , , , , , , 0, , , , , , , , 0, , 0, , , , , , , , , , , , , , , , , , , , , , , , , , , D, , , , B, , B, , , , , 93, A, ,
,NULL01-01 09:00, 5399, DCNN, DLY3208, 1, 778, 1001, , , , , , , , 8, , , , , , , , , , , , , , , , , , , , , 5.8, , 5.7, , , , , , , , , , , , , 0, , , , , , , , 0, , 0, , , , , , , , , , , , , , , , , , , , , , , , , , , D, , , , B, , B, , , , , 98.5, A, ,
,NULL01-01 09:00, 6950, DCNN, DLY3208, 1, 1047, 1011, , , , , , , , 6, , , , , , , , , , , , , , , , , , , , , 6.1, , 5.1, , , , , , , , 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, , , , , , , , , , H, , , , B, , B, , , , , 84.8, A, ,
,NULL01-01 09:00, 7384, DCNN, DLY3208, 1, 1136, 1001, , , , , , , , 4, , , , , , , , , , , , , , , , , , , , , 2.3, , 1.7, , , , , , , , , , , , , 0, , , , , , , , 0, , 0, , , , , , , , , , , , , , , , , , , , , , , , , , , D, , , , B, , B, , , , , 89.2, A, ,
,NULL01-01 21:00, 2084, DCNN, DLY3208, 1, 310, 1011, , , , , , , , 8, , , , , , , , , , , , , , , , , , , , , -.6, , -.6, , , , , , , , , , , , , 1, , , , , , , , 1, , 1, , , , , , , , , , , , , , , , , , , , , , , , , , , D, , , , D, , D, , , , , 99.3, A, ,
,NULL01-01 21:00, 3197, DCNN, DLY3208, 1, 449, 1001, , , , , , , , 8, , , , , , , , , , , , , , , , , , , , , 5.7, , 5.6, , , , , , , , , , , , , 0, , , , , , , , 0, , 0, , , , , , , , , , , , , , , , , , , , , , , , , , , D, , , , B, , B, , , , , 98.5, A, ,
,NULL01-01 21:00, 4967, DCNN, DLY3208, 1, 687, 1001, , , , , , , , 8, , , , , , , , , , , , , , , , , , , , , 5.3, , 4.9, , , , , , , , , , , , , 0, , , , , , , , 0, , 0, , , , , , , , , , , , , , , , , , , , , , , , , , , D, , , , B, , B, , , , , 93.6, A, ,
user@HOST:/loc/yearly_files$
答案 0 :(得分:2)
正则表达式,$
将逗号作为该行的最后一个字符。如果你的分隔符实际上是一个逗号加上一个空格,那么你的正则表达式可能会有一个不可见的字符。
此外,您的NULL
实验似乎表明您有\r\n
行结尾(即您的文件可能是在Windows中生成的)。您可以使用od
或hexdump
$ od -c input.csv | head -18 | tail -4
0000340 , , , , D , , D ,
0000360 , , , , 7 9 , A , ,
0000400 \r \n 1 9 0 0 - 0 1 - 0 1 0 9 :
0000420 0 0 , 3 1 9 7 , D C N N ,
请注意 \r \n
。
您可以使用可能适用于您的Linux发行版的dos2unix
或GNU sed脚本删除这些内容,例如:
$ sed -i 's/\r//' input.csv
或以bash运行的非GNU sed脚本,如下所示:
$ sed -i '' -e $'s/\r//' input.csv
或在FTP文件传输中使用适当的选项。此here还有一些其他选项。
如果您的文件已转换,请尝试简单地匹配该行的结尾,如果您确定您已获得正确数量的分隔符:
sed 's/$/A/' input.csv
或者甚至更好,如果你知道你真的希望字段103是A
:
awk -F, '{$103="A"} 1' OFS=", " input.csv
答案 1 :(得分:0)
如果您知道.csv
文件使用\r\n
作为EOL字符,则可以在将内容通过\r
进行管道传输之前删除tr -d '\r'
字符,然后再将其发送到sed
:
head merged19.csv | tr -d '\r' | sed 's/$/,NULL/'
警告:tr
过滤器会删除文件中存在的所有 \r
字符,并可能会破坏文件结构中的其他内容。<登记/>
但是,如果您的文件包含\r
后面没有\n
,那么您要么使用古老版本的MacOS生成文件(在版本10之前,macOS曾使用\r
作为EOL或者它是一个二进制文件,无论如何使用sed
来处理它是一个坏主意。
答案 2 :(得分:0)
在将输入传递给\r\n
之前,用Unix结束行(\n
)替换Windows行结尾(sed
)的PHP解决方案:
head merged19.csv |\
php -r 'while($line=fgets(STDIN)){echo(str_replace("\r\n","\n",$line));}' |\
sed 's/$/,NULL/'
过滤器是一个小型PHP程序,它从stdin
读取行,用\r\n
替换\n
组合并将它们输出到stdout
。
它不会删除其他组合中文本中嵌入的\r
个字符;应该没有,但这个脚本是安全的,并没有做出这个假设。
该命令包含多行(反斜杠,\
,在行尾告诉bash
该命令在下一行继续),因为PHP脚本的格式很长SO使用的。您可以删除反斜杠字符(\
)并将所有内容写在一行上。
答案 3 :(得分:-1)
您可能遇到终端显示问题 尝试将更改写入单独的文件,然后查看它是否正确。
head merged19.csv | sed "s/$/,NULL/" > testfile
cat testfile
或甚至尝试在以下编辑器中观看:
nano testfile