내가 소유한 것
안녕하세요, 첫 번째 열이 에포크이고 다른 열이 일부 데이터인 다음과 같은 많은 파일을 상상해 보세요.
1000333,34,1
1001456,56,0
1005356,34,2
나는 필요하다
다음과 같이 변환해야 합니다.
0,34,1
1123,56,0
5023,34,2
위 숫자의 첫 번째 열은 다음에서 유래합니다.
1000333 - 1000333 = 0
1001456 - 1000333 = 1123
1005356 - 1000333 = 5023
문맥
파일은 여러 개의 폴더로 나뉘어 하나의 큰 폴더에 저장되며 이름은 다음 logs_swapoff
과 같이 끝납니다(이 폴더에는 건드리지 말아야 할 또 다른 s가 있습니다)._times.csv
csv
파일 예:
logs_swapoff/folder1/modifyMe_times.csv
logs_swapoff/folder1/dontTouchMe_cores.csv
logs_swapoff/folder2/modifyMeToo_times.csv
Bash에서 이 루프를 사용할 계획이지만 작업 자체를 수행하는 방법을 모르겠습니다.
for filename in $(find logs_swapoff/* -name '*_times.csv') ; do
# filename without extension (to write the output with a similar name?)
fname=$(dirname $filename`"/"`basename -s .csv $filename);
?????
done;
매우 감사합니다 :)
답변1
열거 파일
구문 분석된 출력이 find
취약함. find
변환 프로그램을 호출하는 것이 좋습니다 . 출력 파일 이름을 생성하려면 간단한매개변수 확장예를 들어 접미사를 (예를 들어) _times.csv
로 변경하면 _subtracted.csv
충분합니다 .
find logs_swapoff -name '*_times.csv' -exec sh -c '
<"$1" awk "$0" >"${1%_times.csv}_subtracted.csv"
' '…' {} \;
'…'
실행할 awk 코드입니다 . 인용을 단순화하기 위해 쉘 조각 외부에 배치했습니다.
모든 파일을 변환하세요
파일을 한 줄씩 처리하고 각 줄에 몇 가지 산술 연산이 포함된 간단한 텍스트 변환을 수행해야 합니다. 이는 awk를 작업에 이상적인 도구로 만듭니다. 예제 출력의 유일한 어려움은 최소 너비에 맞춰 정렬하려는 것처럼 보이지만 먼저 전체 파일을 읽어 최대 너비를 결정하지 않으면 이 작업을 수행할 수 없다는 것입니다. 몇 개의 추가 공백이 있는 것에 만족한다면 파일을 한 줄씩 처리할 수 있습니다.
awk '
NR==1 {start = $1}
{n = $1 - start; sub(/^ *[0-9]+/, ""); printf "%6d", n; print}
'
설명: 첫 번째 줄에서 start
변수를 첫 번째 숫자로 설정합니다. 그런 다음 각 행에서 start
첫 번째 숫자에서 값을 빼고 첫 번째 숫자를 제거합니다. 빼기 결과(6자까지 공백으로 채워짐)와 줄의 나머지 부분을 인쇄합니다.
이 코드는 첫 번째 숫자 뒤에 항상 공백이 있다고 가정합니다. 그렇지 않은 경우에는 보다 정확하게 일치시킬 수 있습니다.
awk '
NR==1 {match(/[0-9]+/); start = substr(RSTART, RLENGTH)}
match(/[0-9]+/) {n = substr(RSTART, RLENGTH) - start; sub(/ *[0-9]+/, ""); printf "%6d", n; print}
'
필드가 쉼표로 구분되어 있고 공백에 대해 걱정할 필요가 없으면 쉼표를 필드 구분 기호로 선언하세요. 그런 다음 첫 번째 필드를 업데이트된 값으로 간단히 바꿀 수 있습니다.
awk -F, '
NR==1 {start = $1}
{$1 = $1 - start; print}
'
따라서 이들을 하나로 합치십시오(쉼표 버전).
find logs_swapoff -name '*_times.csv' -exec sh -c '
<"$1" awk -F, "$0" >"${1%_times.csv}_subtracted.csv"
' '
NR==1 {start = $1}
{$1 = $1 - start; print}
' {} \;