csv 파일 끝에 새 열을 추가하고 해당 열을 값으로 채우고 싶습니다. 각 레코드 사이에 새로운 빈 행을 표시하는 다음 코드를 사용했습니다. 새로 추가된 빈 줄을 피하는 방법을 알려주십시오.
awk -F "," 'NR == 1 {$5="MonthYear"}{ if (NR>1){split($2,a,"[/ ]");$5=a[1]"/"a[3]}}1' RS='\r' OFS="," Test.csv > Test1.csv
RS='\n' 및 RS='\r\n'을 사용해 보았지만 여전히 동일한 결과가 나타납니다.
입력 파일 - Test.csv
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
실제 출력 파일 - Test1.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
예상 출력 - 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
RS가 없으면 출력은 다음과 같이 왜곡됩니다.
,MonthYearrId,ItemId
,12/17/17 0:03,2323,tv
,12/174/17 7:10,4546,frr
,1/182/18 14:11,2421,fdf
,2/186/18 13:36,4545,dfdf
5,3/5/18 10:47,1232,dfsdf,3/18
답변1
문제를 재현할 수 있는 유일한 방법은 파일에 실제로 구분 기호로 세미콜론이 포함되어 있는 경우입니다.그리고각 줄은 pair 로 끝납니다 \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
답변2
다음을 사용하여 출력 파일에서 빈 레코드를 제거하여 이 문제를 해결할 수 있었습니다.
sed '/^ *$/d' Test1.csv > Test2.csv
답변3
또 다른 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
$