2016-06-29 2 views
-2

Windows 컴퓨터에서 다운로드하여 Mac에 저장 한 텍스트 파일에서 숫자 만 포함 된 줄을 삭제해야합니다. 나는 수있는 모든 라인을 제거있는OS X에서 숫자 만 포함 된 줄을 제거하는 방법은 무엇입니까?

sed '/[A-Za-z]/!d' input-file > output-file 

또는

sed -n '/[[:alpha:]]/p' 

없음을 시도 만

내가

awk '/[A-Za-z]/' input-file > output-file 

에 분명히 생각처럼 AWK를 사용하려고 입력 파일을 2 진수로 변환하여 2 진 출력을 생성합니다.

이것이 텍스트 인코딩 (ISO vs. UTF-8) 또는 관련이 있는지 궁금합니다.

제안 사항?

+0

왜 '/^[0-9] [0-9] * $/디부''나오지도하지? 적어도 하나의 숫자와 숫자 만 포함 된 모든 행이 삭제됩니까? 그게 니가 요구하는거야, 그치? 'numbers'의 지정이 더 복잡 할 필요가 있다면 (소수점, 부호, 한 줄의 여러 숫자 사이의 공백, 선행 공백, 후행 공백, ...), 그렇게해야합니다. 샘플 데이터를 입력으로 포함하고 해당 데이터에 해당하는 예상 출력을 포함해야합니다. 10 줄의 입력으로 충분합니다. 예상 출력은 작아야하거나 샘플 데이터가 도움이되지 않습니다. –

+0

파일이 창에 생성 되었습니까? 그렇다면'dos2unix'를 실행하여 * nix 도구를 사용하기 전에 라인 결말 등을 수정 했습니까? – AlG

+0

Q ('sed '/ [A-Za-z] /! d'...')의 첫 번째 명령은 알파벳 문자가없는 행을 찾아 삭제합니다. 두 번째 ('sed -n '/ [[: alpha :]]/p''는 알파벳 문자를 포함하는 줄을 찾아서 인쇄합니다 (그러나 구두점은 생략 될 것입니다). –

답변

1

숫자 만 포함하는 줄을 삭제하려고합니다. 나는 당신이 10 진수를 제외한 줄을 의미한다고 가정 할 것이다.

또한 파일이 Windows 컴퓨터에서 왔으며 Mac에서 처리하고 있다고 가정합니다. Windows는 \r\n을 사용하여 줄 끝을 표시하므로 파일을 변환하지 않은 경우 삭제하려는 줄에 \r (CR) 문자가 포함될 수 있습니다.

sed '/^[0-9]*\r\?$/d' input-file > output-file 

\?

\r는 선택 사항입니다 것을 의미한다, 그래서 이것은 입력 파일은 Windows 스타일 또는 유닉스 스타일의 라인 엔딩, 또는 혼합물이 있는지 여부를 작동합니다. 나머지 행은 변환하지 않으므로 Windows 형식 입력 파일은 Windows 형식 출력 파일을 생성합니다.

비슷한 grep 명령이 작동하지 않았습니다. grep이 (가) \r을 CR 문자로 인식하지 못했기 때문일 것입니다. MacOS는 grepsed이라는 서로 다른 구현 방식을 가지고 있기 때문에 정확히 같은 방식으로 작동하지 않을 수 있습니다.

더 안전하고 간단한 방법은 먼저 파일을 Unix 형식으로 변환 한 다음 명령을 \r\?없이 사용하는 것입니다.

sed '/^[0-9]*$/d' input-file > output-file 

또는 당신은 간단 grep 명령을 사용할 수 있습니다

grep -v '^[0-9]*$' input-file > output-file 
0

첫 번째 패턴은 기술적으로 효과가 있지만 빈 줄이나 줄 바꿈도 삭제됩니다. 두 번째 패턴은 글자/알파 문자를 검색하면서 -n으로 출력을 억제합니다. 세 번째 패턴은 글자/알파 문자 만 검색합니다.

sed -E '/^[0-9]+$/d' 

위 패턴을 사용하면 숫자 만 들어있는 줄을 찾아 삭제해야합니다.

3

많은 방법이 있습니다. 여기에 하나는 다음과 같습니다

( -n) 자동으로 라인을 인쇄하지만, 비 자리 ( [^0-9])가 그들 ( p)을 인쇄 ( //) 라인에 대한 보이지 않는 말한다
sed -ne '/[^0-9]/p' infile >outfile 

.

또는 awk와 같은 생각 :

awk '/[^0-9]/' infile >outfile 

그 모두가 불행하게도, 또한 (심지어 공백이없는) 어떤 완전히 빈 줄을 제거합니다. 뿐만 아니라 사람들을 포함하려면이 같은 것을해야 할 것 :

# match lines that contain nothing or at least one non-digit 
sed -ne '/[^0-9]/p' -e '/^$/p' infile >outfile 
awk '/[^0-9]|^$/' infile >outfile 

또는

# match lines that aren't all digits 
awk '!/^[0-9]*$/' infile >outfile 

그러나, 전체 행 선택의 종류를 들어, 그것은 사용하기 간단 grep :

# match lines that aren't all digits 
grep -v '^[0-9]*$' infile >outfile 

이 아닌 행만 인쇄합니다. (-v)은 모든 숫자 (^[0-9]*$)로 구성됩니다.

+0

OP가 숫자 만 포함하는 줄을 찾고 있다고 생각합니다 . –

+0

OP는 숫자가 포함 된 줄을 제거하려고합니다. 빈 줄에 대한 경고와 함께 다른 것을 포함하는 줄을 유지하는 것과 같습니다. –

+0

'grep -v '[0-9]'' 'hello1234' 문자가 알파 문자이기도하므로 상관 관계가 표시되지 않습니다. –

관련 문제