길이가 같도록 파일에 줄을 추가합니다.

길이가 같도록 파일에 줄을 추가합니다.

N개의 열과 다른 수의 행(행)이 있는 .csv 파일이 많이 있습니다. ;...;길이가 같도록 빈 줄(N 세미콜론)을 최대한 많이 추가하고 싶습니다 . 가장 긴 파일의 길이를 수동으로 얻을 수 있지만 자동으로 수행하는 것도 좋을 것입니다.

예를 들어:

나는 가지고있다,

file1.csv

128; pep; 93; 22:22:10; 3; 11
127; qep; 93; 12:52:10; 3; 15
171; pep; 73; 22:26:10; 3; 72

file2.csv

128; pep; 93; 22:22:10; 3; 11
127; qep; 93; 12:52:10; 3; 15
121; fng; 96; 09:42:10; 3; 52
141; gep; 53; 21:22:10; 3; 62
171; pep; 73; 22:26:10; 3; 72
221; ahp; 93; 23:52:10; 3; 892

file3.csv

121; fng; 96; 09:42:10; 3; 52
171; pep; 73; 22:26:10; 3; 72
221; ahp; 93; 23:52:10; 3; 892
141; gep; 53; 21:22:10; 3; 62

나는해야한다

file1.csv

128; pep; 93; 22:22:10; 3; 11
127; qep; 93; 12:52:10; 3; 15
171; pep; 73; 22:26:10; 3; 72
;;;;;
;;;;;
;;;;;

file2.csv

128; pep; 93; 22:22:10; 3; 11
127; qep; 93; 12:52:10; 3; 15
121; fng; 96; 09:42:10; 3; 52
141; gep; 53; 21:22:10; 3; 62
171; pep; 73; 22:26:10; 3; 72
221; ahp; 93; 23:52:10; 3; 892

file3.csv

121; fng; 96; 09:42:10; 3; 52
171; pep; 73; 22:26:10; 3; 72
221; ahp; 93; 23:52:10; 3; 892
141; gep; 53; 21:22:10; 3; 62
;;;;;
;;;;;

답변1

댓글에 제안을 주신 @Sparhawk에게 감사드립니다. 이를 바탕으로 업데이트하겠습니다.

#!/bin/bash

emptyLine=;;;;;;;
rr=($(wc -l files*pattern.txt |  awk '{print $1}' | sed '$ d'))
max=$(echo "${rr[*]}" | sort -nr | head -n1)
for name in files*pattern.txt;do
    lineNumber=$(wc -l < $name)
    let missing=max-lineNumber
    for((i=0;i<$missing;i++));do
        echo $emptyLine >> $name
    done
done

글쎄요, 우아하지도 효율적이지도 않습니다. 실제로 이 작업은 몇 초 정도 걸리며, 적은 양의 데이터를 고려하면 영원처럼 들립니다. 그래도 작동합니다.

#!/bin/bash

emptyLine=;;;;;;;
rr=($(wc -l files*pattern.txt |  awk '{print $1}' | sed '$ d'))
max=$(echo "${rr[*]}" | sort -nr | head -n1)
for name in $(ls files*pattern.txt);do
    lineNumber=$(cat $name | wc -l )
    let missing=max-lineNumber
    for((i=0;i<$missing;i++));do
        echo $emptyLine >> $name
    done
done

파일을 나열하는 데 사용할 수 있는 패턴이 있는 경우 파일이 있는 디렉토리에 이 파일을 넣습니다.files*pattern.txt

답변2

@myradio의 답변이 개선되었습니다.
루프 내부에 작성된 부분은 awk훨씬 더 빨라야 합니다.

max=$(wc -l file*.csv | sed '$ d' | sort -n | tail -n1 | awk '{print $1}' )
for f in file*.csv; do
    awk -F';' -v max=$max \
      'END{
         s=sprintf("%*s",FS,"");
         gsub(/ /,"-",s);
         for(i=NR;i<max;i++)
           print s;
       }' "$f" >> "$f"
done

-F파일에 대한 올바른 필드 구분 기호를 설정할 수 있습니다 (여기 -F';').

이 섹션에서는 (= 필드 구분 기호) s=sprintf();gsub();의 올바른 수를 동적으로 설정합니다 (FS통과하다). 원하는 경우
간단히 다른 정적 콘텐츠로 바꿀 수 있습니다.print ";;;;;"

답변3

각 파일의 행을 한 번만 계산하려면 다음을 수행하십시오.

wc -l *csv |sort -nr| sed 1d | {
    read max file
    pad=$(sed q "$file"|tr -cd ";")  # extract separators from first record
    while read lines file ; do
        while [ $((lines+=1)) -le $max ] ; do
                echo "$pad" >> "$file"
        done
    done
}

파일 이름에 줄 바꿈이 있으면 루프에 문제가 발생 sort하지만 while read일반 공백이 포함된 파일 이름을 처리할 수 있습니다.

관련 정보