Grep для символов ASCII (подмножество UTF-8) в Linux / GNU:
dd if=/dev/random bs=1 count=1G | egrep -ao "\w" | tr -d '\n'
Единственный способ воспроизвести вашу проблему — это если файл действительно содержит точки с запятой в качестве разделителей и каждая строка заканчивается парой \r\n
. Когда это происходит, использование \r
в качестве RS приводит к тому, что \n
оказывается на следующей строке.
Исходный файл используется:
Id,Day,UserId,ItemId
1,12/1/17 0:03,2323,tv
2,12/14/17 7:10,4546,frr
3,1/22/18 14:11,2421,fdf
4,2/16/18 13:36,4545,dfdf
5,3/5/18 10:47,1232,dfsdf
Самое простое решение — удалить \r
в файле (, возможно, с помощью dos2unix ).
Проще сделать это внутри awk:
$ awk '{gsub(/\r/,"")}; NR==1 {print $0,"MonthYear"}; NR>1 {print $0,$2"/"$4}' FS="[,/ ]" OFS=, Test.csv
Id,Day,UserId,ItemId,MonthYear
1,12/1/17 0:03,2323,tv,12/17
2,12/14/17 7:10,4546,frr,12/17
3,1/22/18 14:11,2421,fdf,1/18
4,2/16/18 13:36,4545,dfdf,2/18
5,3/5/18 10:47,1232,dfsdf,3/18
Мне удалось решить эту проблему, удалив пустые записи из выходного файла с помощьюsed '/^ *$/d' Test1.csv > Test2.csv
Другой awk
подход
$ awk '{print $0,NR==1?" MonthYear":substr($2,0,index($2,"/"))substr($2,length($2)-1)}' Test.csv
Id Day UserId ItemId MonthYear
1 12/1/17 0:03 2323 tv 12/17
2 12/14/17 7:10 4546 frr 12/17
3 1/22/18 14:11 2421 fdf 1/18
4 2/16/18 13:36 4545 dfdf 2/18
5 3/5/18 10:47 1232 dfsdf 3/18
$