명령줄 - 조건부로 하위 문자열 저장

명령줄 - 조건부로 하위 문자열 저장

명령줄 유틸리티가 조건부로 하위 문자열을 다른 파일에 저장할 수 있습니까? file.txt다음 줄을 포함하는 파일( )이 있습니다 .

1/1_ABCD4.txt:20020711
1/1_ABCD10.txt:20020731
2/2_ABCD2.txt:20071103
2/2_ABCD5.txt:20071107
3/3_ABCD1.txt:20090225
3/3_ABCD3.txt:20090230

20020711내 목표는 20020731파일 1, 파일 및 파일 20071103로 저장하는 것 입니까 ?20071107220090225200902303

:다음 명령을 사용하여 원하는 하위 문자열을 추출할 수 있지만 그렇게 하면 참조 번호가 손실됩니다.

$ grep -oP 'txt\:\K[A-Z0-9-]+' 'path/to/file.txt'

20020711
20020731
20071103
20071107
20090225
20090230

/명령줄을 사용하여 첫 번째 숫자가 대상 참조로 앞에 있는 세 개의 개별 파일을 빌드할 수 있습니까? 대상은 원본 텍스트 파일과 동일한 디렉터리에 있을 수 있습니다.

  1. 문서:
20020711
20020731
  1. 문서:
20071103
20071107
  1. 문서:
20090225
20090230

감사해요.

답변1

그리고 awk:

awk -F'[:/]' '{print $NF > $1}' file

/줄을 나누기 위해 구분 기호로 및 를 사용합니다 :. 마지막 필드( $NF)는 인쇄할 내용이고 첫 번째 필드( $1)는 출력 파일 이름입니다.


테스트 입력 파일을 실행한 후:

$ head 1 2 3
==> 1 <==
20020711
20020731

==> 2 <==
20071103
20071107

==> 3 <==
20090225
20090230

또한 데이터에 따라 임의의 이름을 가진 파일로 인쇄하는 것을 방지하기 위해 이 작업 전에 조건을 추가하는 것이 좋습니다. 이는 구조가 다른 행이 더 많으면 위험할 수 있습니다.

첫 번째 필드(파일 이름)에 숫자만 있는 경우에만 인쇄하려는 경우의 간단한 예:

awk -F'[:/]' '$1 ~ /^[0-9]+$/ {print $NF > $1}' file

답변2

사용sed

$ sed s'~\([0-9]\)/[^:]*:\(.*\)~echo \2 >> \1~e' file.txt
$ cat 1
20020711
20020731

관련 정보