
7개의 열이 있는 csv 파일이 있습니다. 빈 셀과 셀 사이에 약간의 공백이 있습니다. 빈 셀을 NA로 바꾸고 추가 공백을 제거하려면 어떻게 해야 합니까? 매우 감사합니다!
내 파일의 모양은 다음과 같습니다. 하지만 복사하여 붙여넣을 때 이리저리 움직이는 것 같습니다.
130070078,PPW0001,1,4,4HW ,2,15.61943874
120040039,PPW0002,0,0, ,0,0
120040043,PPW0003,1,3,3WE ,1,14.43394935
답변1
너의 답:
sed 's/ *,/,/g' file1 | sed 's/,,/,NA,/g' > file2
비어 있는 경우 마지막 필드에 'NA'를 얻으려면 다음을 수행하십시오.
sed 's/ *,/,/g' file1 | sed 's/,,/,NA,/g' | awk -F, 'OFS="," {if ($NF == "") $NF = "NA"; print}'> file2
다음을 사용할 수도 있습니다.
sed 's/,,/,NA,/g' file1 | tr -d ' ' | awk -F, 'OFS="," {if ($NF == "") $NF = "NA"; print}'
답변2
αғsнιе의 답변은 저에게 효과적이었지만 조금 설명하고 싶습니다.
나는 다음과 같은 것을 시도하고있었습니다.
echo "1,,2,,,3,,,4,,,,5,,,,,,,,,,6" | sed 's/,,/,-,/g'
어느 출력
1,-,2,-,,3,-,,4,-,,-,5,-,,-,,-,,-,,-,6
반복되는 빈 필드로 인해 마지막 쉼표는 첫 번째 교체의 일부이고 다음 원하는 교체의 시작이므로 매 두 번째 빈 필드가 교체됩니다.
이제 다음과 같은 작업을 수행할 수 있습니다.
echo "1,,2,,,3,,,4,,,,5,,,,,,,,,,6" | sed -e 's/,,/,-,/g' -e 's/,,/,-,/g'
또는
sed 's/,,/,-,/g;s/,,/,-,/g'
두 번째 명령은 누락된 셀을 가져오므로 모든 셀을 대체하지만 약간 지저분합니다.
αғsнιι의 명령은 레이블과 점프를 사용하여 본질적으로 동일한 작업을 수행하는데, 여러분이 할 수 있다는 것을 몰랐습니다.
sed ':MYLABEL; s/,,/,-,/g; t MYLABEL;'
산출:
1,-,2,-,-,3,-,-,4,-,-,-,5,-,-,-,-,-,-,-,-,-,6
따라서 명령의 첫 번째 부분은 레이블을 생성합니다.
그러면 우리는 같은 대체물을 갖게 됩니다.
그런 다음 이전 대체 명령이 성공하면 레이블로 점프하는 것을 의미하는 t 명령이 있습니다.