패턴 일치를 기반으로 한 파일에서 다른 파일로 줄을 이동하는 방법은 무엇입니까?

패턴 일치를 기반으로 한 파일에서 다른 파일로 줄을 이동하는 방법은 무엇입니까?

텍스트 파일의 줄을 다른 텍스트 파일로 이동하고 싶습니다. 이 줄에는 밑줄로 시작하는 단어가 포함되어 있습니다. 이 단어는 다음 위치에 있습니다.육도 음정줄 필드는 슬래시로 구분됩니다. 예를 들어 _Nokia아래 예제 입력 파일에서 여섯 번째 필드가 포함된 줄을 이동합니다.

Apple/One-plus/Samsung/Mi/Sony/_Nokia/
Apple/One-plus/Samsung/Mi/Lenovo/_Nokia/
Apple/One-plus/Samsung/Mi/HTC/OPPO/

정규식을 사용하여 해당 줄을 이동하려고 시도했지만 grep작동하지 않습니다.

$ grep -F 'Apple/One-plus/Samsung/Mi/^[a-zA-Z]([\w -]*[a-zA-Z])?$/_Nokia/' match.txt >file1.txt
$ grep -F -v "Apple/One-plus/Samsung/Mi/^[a-zA-Z]([\w -]*[a-zA-Z])?$/_Nokia/" match.txt \
    > match.txt.tmp && mv match.txt.tmp match

예상 출력

$ cat file1.txt
Apple/One-plus/Samsung/Mi/Sony/_Nokia/
Apple/One-plus/Samsung/Mi/Lenovo/_Nokia/
$ cat match
Apple/One-plus/Samsung/Mi/HTC/OPPO/

패턴 일치를 기반으로 한 파일에서 다른 파일로 줄을 이동하는 방법은 무엇입니까?

답변1

원래의

-F관련 옵션을 사용하여 정규식을 지정할 수 없습니다 grep. 정규식에 대한 질문도 있습니다. 이 문자가 ^줄의 시작 부분과 일치하도록 앵커로 사용되는 경우 정규식의 첫 번째 문자여야 합니다.

prompt% cp -v input input.back
prompt% grep -e "$regex" input.back > output
prompt% grep -v "$regex" input.back > input

정규식:원저자가 구체적인 입력을 제공하지 않아 적합한 정규식을 찾기가 어려웠습니다.

편집하다:마지막으로 원본 포스터는 샘플 입력 파일을 제공합니다.

Apple/One-plus/Samsung/Mi/Sony/_Nokia/
Apple/One-plus/Samsung/Mi/Lenovo/_Nokia/
Apple/One-plus/Samsung/Mi/HTC/OPPO/

정규식: regex

regex='\([-[:alpha:]]\+\/\)\{5\}_Nokia\/'

대체 솔루션

이러한 유사한 솔루션은 sed 매뉴얼을 읽은 적이 없는 초보자에게는 권장되지 않습니다.

sed -n "/$regex/p;/$regex/d;w input" input.back > output

대략적으로 말하면, 정규식과 일치하는 행을 파일에 저장한 output다음 해당 sed 버퍼에서 이를 제거하고 버퍼 내용을 파일에 씁니다 input.

sed -i.back -e "/$regex/w output" -e "/$regex/d" input

이 명령에는 미묘한 차이가 있지만 두 번째 명령이 더 편리합니다.

답변2

적합한 최신 버전의 GNU awk( )가 있으면 gawk다음을 수행할 수 있습니다.

awk -i inplace -F'/' '$7 == "_f" {print > "otherfile"; next} 1' file

awk가 이 옵션을 지원하지 않는 경우 -i inplace동일한 작업을 수행할 수 있지만 출력을 임시 파일로 리디렉션한 다음 이름을 바꿀 수 있습니다.

답변3

이 제안은 어떻습니까? 이건 별로 간단한 제안이 아니다@steeldriver의 답변그럼에도 불구하고 이는 점진적인 솔루션입니다(단계별).

$ cut -d/ -f7 data.txt  | grep -n _f | cut -d: -f 1 | xargs -i sed -n {}p data.txt > otherfile.txt
  • _f다른 파일과 일치하는 항목을 만들 때의 패턴입니다.

  • data.txt당신 파일이에요

  • /당신의 구분 기호는 무엇입니까

이것이 작동한다면 계산을 수행하여 comm원본 파일에 무엇을 보관해야 하는지 알아보세요.

$ comm -23 data.txt otherfile.txt > remainder.txt

나머지 .txt는 비트가 제거된 data.txt입니다.

답변4

먼저 다음을 수행하여 예상 줄을 다른 파일(outem.txt)로 이동할 수 있습니다.

sed -n  '/_/w outemp.txt' input_file

그런 다음 다음을 통해 input_file에서 다음 줄을 제거하십시오.

sed  -i '/_/d' input_file

검사 결과:

cat outemp.txt 
Apple/One-plus/Samsung/Mi/Sony/_Nokia/
Apple/One-plus/Samsung/Mi/Lenovo/_Nokia/

cat input_file
Apple/One-plus/Samsung/Mi/HTC/OPPO/

관련 정보