명령줄 유틸리티가 조건부로 하위 문자열을 다른 파일에 저장할 수 있습니까? 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
로 저장하는 것 입니까 ?20071107
2
20090225
20090230
3
:
다음 명령을 사용하여 원하는 하위 문자열을 추출할 수 있지만 그렇게 하면 참조 번호가 손실됩니다.
$ grep -oP 'txt\:\K[A-Z0-9-]+' 'path/to/file.txt'
20020711
20020731
20071103
20071107
20090225
20090230
/
명령줄을 사용하여 첫 번째 숫자가 대상 참조로 앞에 있는 세 개의 개별 파일을 빌드할 수 있습니까? 대상은 원본 텍스트 파일과 동일한 디렉터리에 있을 수 있습니다.
- 문서:
20020711
20020731
- 문서:
20071103
20071107
- 문서:
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