다음과 같은 방법을 찾고 있습니다.
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
오고 , 마지막으로 임의의 문자가 오는 프로세스가 있는 파일입니다 .2
6
각 줄을 문자별로 분할하고 /
그 사이에 필드,,,, 뒤에 문자열이 오는 줄을 형성합니다.5
6
7
8
/
",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]*