행 사이에 빈 새 행을 만들지 않고 AWK를 사용하여 csv 파일에 값이 포함된 새 열을 추가합니다.

행 사이에 빈 새 행을 만들지 않고 AWK를 사용하여 csv 파일에 값이 포함된 새 열을 추가합니다.

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
$

관련 정보