데이터는 두 번째 행에서 시작됩니다. 첫 번째 인스턴스를 삭제하는 간단한 스크립트나 유틸리티가 있습니까?^m
데이터 행당?
이 질문은 다음과 같이 다시 작성할 수도 있습니다. ^m
두 번째(짝수) 인스턴스를 모두 삭제하는 방법은 무엇입니까? 흥미롭고 스마트한 답변을 기대하세요. 우분투나 이와 유사한 환경이 바람직합니다.
원시 데이터는 영리하게 잘라내고, 붙여넣고, 구문 분석할 수 있습니다.
Date,From,To,Flight_Number,Airline,Distance,Duration,Seat,Seat_Type,Class,Reason,Plane,Registration,Trip,Note,From_OID,To_OID,Airline_OID,Plane_OID^M
- -,JFK,OTBD,American Airlines (AA),American Airlines,6687,13:52,,,,,777^M,,,"Direct",3797,2241,24^M
- -,JFK,OTBD,Qatar Airways (QR),Qatar Airways,6687,13:52,,,,,77W^M,,,"Direct",3797,2241,4091^M
즉, 이 질문을 하는 이유는 예상치 못한 ^m이 Libre-Office Calc(스프레드시트)에서 가져오기 문제를 일으켰기 때문입니다. 즉, 예상된 줄 바꿈이 발생했습니다.
답변1
파일을 DOS 형식(CRLF 줄 끝)으로 유지한다고 가정하면 제거할 수 있습니다.모두CR을 입력하고 줄 끝에 다시 추가하세요.
그래서
tr -d '\015' < srcfile | unix2dos > newfile
자세한 설명 수정:
이것
tr -d '\015'
벗겨질 것이다모두파일의 control-M 문자. -d
to는 tr
"삭제"를 의미하며 '\015'
8진수 형식의 control-M 문자입니다.
이것
unix2dos
LF 문자 앞에 CR(control-M)을 삽입하여 LF(개행; control-J;) 문자를 CRLF로 변환합니다. 이렇게 하면 unix 형식의 텍스트 파일이 DOS 형식의 텍스트 파일로 변환됩니다.
두 가지를 합치면 불량 ^M을 모두 제거하고 각 줄 끝에 ^M만 있는지 확인합니다.
답변2
(귀하의 이미지가 일반 흰색이 아닌 파란색으로 나타나는 점을 토대로 문자 그대로 ^M
캐럿+M 조합이 아닌 캐리지 리턴(CR) 문자를 참조하고 있다고 가정합니다. (예, 게시된 상황입니다. 이미지로서의 텍스트는 실제로 많은 도움이 됩니다 ))
1) LibreOffice에 데이터를 공급하므로 Unix 스타일 개행 문자(CRLF가 아닌 LF만)를 잘 처리하는지 확인하고 모든 캐리지 리턴을 완전히 제거할 수 있습니다.
tr -d '\r' < input > output
2) DOS 스타일 CRLF 줄 끝을 유지하고 줄 중간에 있는 CR:만 제거하려면(즉, 바로 뒤에 LF가 오지 않음) Perl에서 다음을 수행할 수 있습니다.
perl -pe 's/\r(?!\n)//g' < input > output
s/xxx/yyy/g
xxx
의 모든 항목 을 캐리지 리턴으로 해석되는 로 바꿉니다 yyy
. 이는 "뒤에 "가 없음을 의미합니다. 여기서 은 개행/개행 문자입니다. 아무것도 대체되지 않으므로 일치 항목이 제거됩니다.\r
(?!\n)
\n
\n
sed
와 비슷한 작업을 수행할 수 있지만 \r
모든 버전이 이스케이프를 지원하는 것은 아니며 sed
명령 ctrl-M
줄에 문자 그대로 문자를 입력하는 것은 약간 짜증스럽습니다. (Ubuntu에는 이를 지원하는 GNU sed가 있지만 Perl도 있습니다.)
나는 각 줄의 첫 번째 발생에 대해 당신이 말한 모든 것을 무시하고 첫 번째 줄을 무시했습니다. 입력에 항상 올바른 수의 가짜 추가 제어 문자가 포함되어 있다고 믿는 것이 약간 취약하다는 것을 알았기 때문입니다. (한 줄에 ^M
:s가 두 개 있거나 없으면 어떻게 되나요?)
답변3
다음은 사용할 수 있는 한 가지 옵션입니다 sed
.
sed -i.bak '2,$s/\r//' filename
할 수 있는 작업:
-i.bak
원본 파일의 백업을filename.bak
.2,$
두 번째 줄에서 시작하여 파일 끝까지 계속됩니다.s/\r//
각 줄에서 첫 번째 캐리지 리턴(스크린샷의 ^M)을 제거합니다.
게시된 발췌문의 예제 명령을 사용하여 vi에 캐리지 리턴을 수동으로 입력했습니다.
$ cat -A test_sed
Date,From,To,Flight_Number,Airline,Distance,Duration,Seat,Seat_Type,Class,Reason,Plane,Registration,Trip,Note,From_OID,To_OID,Airline_OID,Plane_OID^M$
- -,JFK,OTBD,American Airlines (AA),American Airlines,6687,13:52,,,,,777^M,,,"Direct",3797,2241,24^M$
- -,JFK,OTBD,Qatar Airways (QR),Qatar Airways,6687,13:52,,,,,77W^M,,,"Direct",3797,2241,4091^M$
$ sed -i.bak '2,$s/\r//' test_sed
$ cat -A test_sed
Date,From,To,Flight_Number,Airline,Distance,Duration,Seat,Seat_Type,Class,Reason,Plane,Registration,Trip,Note,From_OID,To_OID,Airline_OID,Plane_OID^M$
- -,JFK,OTBD,American Airlines (AA),American Airlines,6687,13:52,,,,,777,,,"Direct",3797,2241,24^M$
- -,JFK,OTBD,Qatar Airways (QR),Qatar Airways,6687,13:52,,,,,77W,,,"Direct",3797,2241,4091^M$
답변4
주제의 질문에 답하십시오.파일에서 다른 모든 CR 문자를 제거합니다., GNU 사용 awk
:
awk -v RS='\r' '{ORS = NR % 2 ? RT : ""; print}' < infile > outfile
짝수에 대해 (입력) 레코드 구분 기호를 CR로 설정하고 출력 레코드 구분 기호를 RT로 설정합니다(이 레코드의 레코드 종결자는 마지막 레코드이고 입력이 CR 문자로 끝나지 않는 경우 CR이거나 비어 있을 수 있음). 기록의 (때 NR % 2 != 0
).