파일에서 두 번째 줄마다 삭제하는 방법?


25

파일:

Data inserted into table. Total count 13
No error occurred
Data inserted into table. Total count 45
No error occurred
Data inserted into table. Total count 14
No error occurred
Data inserted into table. Total count 90
No error occurred

예상 출력 파일 :

Data inserted into table. Total count 13
Data inserted into table. Total count 45
Data inserted into table. Total count 14
Data inserted into table. Total count 90

출력이 이런 식으로 보이기를 원합니다. 두 번째 줄은 모두 삭제되지만 줄 사이에는 간격이 없습니다.


5
두 번째 줄이나 "오류가 발생하지 않았습니다" 가 포함 된 모든 줄을 삭제 하시겠습니까 ? 연속 된 두 줄에 "오류 없음" 이 있으면 어떻게 됩니까?
Tulains Córdova

1
@ user1598390 생각합니다 ... grep -v "No error occurred" file이 경우이 명령이 작동해야합니다 ... @ paul 이 응답 한 것. 출력 파일에는이 부분에 "오류 없음"이 포함 된 행이 없습니다.
pmaipmui

1
그러면 질문의 제목이 오도됩니다.
Tulains Córdova

답변:


36

sed:

sed -e n\;d <file

POSIX로 awk:

awk 'FNR%2' <file

나이가 든 경우 awk(예 oawk:) :

oawk 'NR%2 == 1' <file

ex:

$ ex file <<\EX
:g/$/+d
:wq!
EX

파일을 그 자리에서 편집합니다.

  • g 세계적인 명령을 표시하다
  • /$/ 모든 라인과 일치
  • +d 다음 줄을 삭제
  • wq! 모든 변경 사항을 저장하십시오

이 접근 방식은 접근 방식과 동일한 이상적인 방식을 공유하고 sed현재 줄의 모든 다음 줄을 줄 1부터 삭제합니다.

perl:

perl -ne 'print if $. % 2' <file

그리고 perl6:

perl6 -ne '.say if $*IN.ins % 2' <file
perl6 -ne '.say if ++$ % 2' <file

예 ... 그 작업 ... : ... 첫 번째 나 또한 두 번째 시도했다 .... 노력하고 있습니다 .. 그 이야기`AWK : 구문 오류 호선의 AWK : 근처 1 호선을 구제 '
pmaipmui

sed -en \; d <파일 ~ 예 작동 @cuonglm ...
pmaipmui

1
귀중한 캐릭터를 저장하는 n\;d대신 사용 'n;d'했지만 -e스위치와 파일 리디렉션을 불필요하게 사용하면 논리가 창 밖으로 나옵니다 <!
Tom Fenech

1
@Geek :의 짧은 버전이므로 sed -e 'n;d'한 문자 만 저장하십시오.
cuonglm

1
@Geek : n패턴 공간을 -n사용한 경우 표준 출력에 패턴 공간을 쓴 다음 패턴 공간을 다음 줄로 바꿉니다 . 여기에 모든 홀수 줄이 인쇄되고 n, 짝수 줄까지 패턴 공간으로 읽히지 만 명령으로 즉시 삭제됩니다 d.
cuonglm

62

두 번째 줄을 모두 삭제하여이 문제를 해결하면 오류가 발생하기 쉽습니다 (예 : 프로세스가 때때로 두 개의 의미있는 줄을 생성하는 경우). 가비지를 걸러내는 것이 좋습니다.

grep -v "No error occurred" file

필터로 실행할 수 있으며 여기에 더 많은 가비지 패턴을 추가하고 결과를 향상시킬 수 있습니다.


9
때로는 두 번째 줄이 중요하다는 것을 지적한 +1!
Kaz Wolfe

12

GNU로 질문에 대해 sed:

sed '0~2d' file

두 번째 줄마다 삭제하지만 내용별로 필터 줄을 제공하고 싶습니다.

sed '/Data/! d' file

또는 같은 결과

sed '/No error/d' file

나오지도 '/ 없음 오류 / D'파일이 없습니다 ~ 원하는 출력 @Costas에게 제공
pmaipmui

5
마지막 두 개는 복잡한 방법으로 작성 grep Data하고grep -v 'No error'
Stéphane Chazelas

5

사용하는 방법은 다음과 같습니다 sed.

sed -n 'p;n' filename

GNU의 또 다른 방법 sed:

sed -n '1~2p' filename

위 명령의 출력 :

Data inserted into table. Total count 13
Data inserted into table. Total count 45
Data inserted into table. Total count 14
Data inserted into table. Total count 90

말할 때 무엇을 의미 shortest way using sed합니까?
cuonglm

g명령 의 이유는 무엇입니까 ? sed -n 'p;n'충분하다.
Costas

@ cuonglm : 나는 간단한 방법을 말하는 것을 의미합니다. 그건 그렇고 그 단어를 제거했습니다. :)
serenesat

@ 코스타 : 감사합니다! 방금 확인했지만 작동하지 않습니다 g. 명령에서 g를 제거했습니다. :)
serenesat

4

당신은 시도 할 수 있습니다 awk:

awk 'NR % 2 != 0' file

또는 다음을 포함하는 줄만 인쇄 할 수 있습니다 Data inserted.

awk '$0 ~ /Data inserted/' file

나는 둘 다 대답을 시도하고 모두 작동하고 있습니다 ... :)
pmaipmui

3

또 다른 대답은 vi / vim을 사용할 수 있다는 것입니다.

qdjddq

그리고 파일이 500 줄 (예 :)이라면

250 @ d

그런 다음 쓰기 및 종료 유형

:엑스

또는 문제가 발생하여 저장하고 싶지 않은 경우 :

:큐!

설명:

q      #Start Recording
 d     #Put the recording into register 'd'
  j    #Move the cursor down
   dd  #Delete the line
     q #Stop recording


250    #Number of repeats
   @d  #Playback the recording in register 'd'.

2

다른 방법으로 수행 할 수 있습니다.

< file paste - - | cut -f1

홀수 라인에 탭이 포함되어 있지 않다고 가정합니다. 그렇다면 다른 구분 문자를 선택해야합니다 (예 : :여기).

< file paste -d: - - | cut -d: -f1

1
질문을 처음 보았을 때 이것을 염두에 두었 sed습니다. 거대한 파일 (예 : 20mil 줄) 로 속도 테스트를 실행하는 것이 흥미로울 것 입니다. 어쨌든, +1이지만 실제로 두통을 피하려면 다음과 같이 텍스트 파일에서 발생하지 않을 분리 문자를 선택하십시오 $'\002'.
don_crissti

@don_crissti yes 구분 기호로 비 인쇄 문자를 사용하는 것이 좋습니다. 그렇습니다. 이것은 sed 솔루션보다 훨씬 빠릅니다. 로 테스트 파일을 만들었습니다 seq 100000000 > 100mil.txt. 이 paste|cut솔루션은 약 12 ​​초 동안 약 7.5 초 만에 완료되었습니다 sed. 반복 가능한 것 같습니다. grep그래도 가장 빠릅니다. 표준 GNU 도구가 포함 된 Ubuntu 14.04.
Digital Trauma

네, paste+ cut는 그들의 업무에 매우 최적화되어 있으므로 당연히 그들의 조합은 매우 빠릅니다 ...
don_crissti


0

또한 조금 느리지 만 문제를 해결합니다.

vim -c "%normal jdd" -c "wq" file
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.