캡처 패턴 파일 이름을 찾아 리디렉션합니다.

캡처 패턴 파일 이름을 찾아 리디렉션합니다.

다음과 같은 방법을 찾고 있습니다.

find /path -name "201[2-6]*" | awk -F"/" '{print $5"/"$6"/"$7"/"$8",0,0,0"}' > archives_201\1.csv

파일 이름을 캡처한 결과 일 archives_201\1.csv수 있습니다 .archives_201[2-6].csv

나는 일년 내내 순환함으로써 이것을 할 수 있다는 것을 알고 있습니다. 해당 폴더에는 약 1억 개의 파일이 포함되어 있을 것이므로 피해야 합니다.

[편집하다]

나도 시도했다

 find /path -name "201[2-6]" | awk -F"/" 'BEGIN {print $5"/"$6"/"$7"/"$8",0,0,0" > ${8:0:4}"_export_0504.csv"}' 

하지만 얻었어

awk: BEGIN {print $5"/"$6"/"$7"/"$8",0,0,0" > ${8:0:4}"_export_0504.csv"}
awk:                                                                  ^ syntax error

답변1

질문 1:

/path이름이 로 시작하고 , 과 사이에 단일 숫자가 201오고 , 마지막으로 임의의 문자가 오는 프로세스가 있는 파일입니다 .26

각 줄을 문자별로 분할하고 /그 사이에 필드,,,, 뒤에 문자열이 오는 줄을 형성합니다.5678/",0,0,0"

이 줄과 다음 줄을 file이라는 파일에 저장합니다. 파일 이름 뒤에는 archives_201이전에 입력 파일 이름에서 찾은 것과 동일한 단일 숫자가 오고 확장자는 .csv.

해결 방법 1:

awk -F/ '
    FNR==1 {match(FILENAME, /\/(201[2-6])/, m)}
    {print $5"/"$6"/"$7"/"$8",0,0,0" >> "archives_"m[1]".csv"}
' /path/201[2-6]*

논평:

샘플 입력 파일과 원하는 출력을 제공하지 않았기 때문에 여러 지점에서 몇 가지 추측을 해야 했습니다.

다음을 사용하여 무엇을 달성하고 싶은지 모르겠습니다 > ${8:0:4}"_export_0504.csv".

find결과를 파이핑하면 awk혼란스럽습니다. 실제로 각 파일을 읽으시겠습니까 awk, 아니면 텍스트 목록만 처리하시겠습니까? 후자인 경우 필드의 엄격한 구성 ($5"/"$6"/"$7"/"$8)으로 인해 모든 파일이 동일한 디렉터리에 있어야 하는데 왜 를 사용하겠습니까 find?

filename 이외의 검색 문자열로 시작하는 경로 부분이 없다고 가정합니다 201[2-6]. >>필요할 때 덮어쓰기( )하는 대신 동일한 파일에 여러 줄을 추가( ) 하기를 원한다고 가정합니다 >. 모든 파일이 동일한 디렉토리에 있다고 가정하고 awk파일을 처리한다고 가정합니다.콘텐츠하지만 기록상으로는이름.

그러나 필드 구분 기호로 선택한 것은 /후자의 가정을 의미하므로 이에 대해서도 다루려고 합니다.


질문 2:

에 있는 파일의 파일 이름을 처리합니다 /path. 이름은 로 시작하고 201그 뒤에 2과 사이에 단일 숫자가 오고 6마지막으로 임의의 문자가 옵니다.

각 파일 이름을 문자를 기준으로 분할 /하고 5번째, 6번째, 7번째 및 8번째 구성 요소( /사이의 내용은 유지)로 한 줄을 구성한 다음 ",0,0,0"문자열을 만듭니다.

이 줄과 다음 줄을 이름 뒤에 archives_201파일 이름 앞에 있는 동일한 단일 숫자(확장자 .csv.

해결 방법 2:

awk -F/ '
    FNR==1 {
        match(FILENAME, /\/(201[2-6])/, m);
        $0=FILENAME;
        print $5"/"$6"/"$7"/"$8",0,0,0" >> "archives_"m[1]".csv"
    }
' /path/201[2-6]*

관련 정보