큰 파일의 카운터 필드를 반복된 값으로 바꾸기

큰 파일의 카운터 필드를 반복된 값으로 바꾸기

약 70,000줄이 포함된 거대한 텍스트 파일이 있습니다. 내 목표는 이 파일을 읽고, 패턴("count")을 일치시키고, 해당 값을 반복된 숫자로 추가하거나 바꾸는 것입니다.

내가 하고 있는 일은:

  1. 파일을 읽으십시오.
  2. Grep은 패턴 수를 찾습니다.
  3. 일치하는 항목이 있으면 패턴이 제거됩니다.
  4. 이 줄에 원하는 패턴(Count = $i)을 추가하세요.
  5. 증분변수 i.

이것은 코드입니다

line_count=0
i=0
while read line
do
        line_count=$((line_count+1))
        if echo "$line" | grep -q "Count"
        then
                sed -i "$line_count d" /tmp/$rand_file1
                sed -i "$line_count i Count = $i" /tmp/rand_file1
                i=$((i+1))
        fi
done </tmp/rand_file1

위 기술을 완료하는 데 약 25분이 소요됩니다. 더 큰 데이터 파일을 처리하게 되므로 이 시간을 줄일 수 있는 방법이 있습니까?

입력 스키마 및 파일과 예상 출력은 다음과 같습니다.

입력 파일

Count
Name = Sarah
ID = 113
PhNo =

Count
Name = John
ID = 787
PhNo =

Count = 123
Name = Mike
ID = 445
PhNo =

Count Now
Name = Max
ID = 673
PhNo =

예상 출력 파일

Count = 1
Name = Sarah
ID = 113
PhNo =

Count = 2
Name = John
ID = 787
PhNo =

Count = 3
Name = Mike
ID = 445
PhNo =

Count = 4
Name = Max
ID = 673
PhNo =

답변1

쉘에서 텍스트 파일을 구문 분석하는 것은매우느리고 오류가 발생하기 쉽습니다. grep입력 파일의 각 줄과 sed포함에 대해 한 번씩 실행 합니다 Count.

내가 아는 한, 이것은 다음으로 대체될 수 있습니다.

awk '$1 == "Count" { printf("Count = %d\n", ++i); next } { print }' rand_file1 >rand_file1.new

Count =첫 번째 필드가 있는 행에 도달하면 올바른 증분으로 행을 출력 Count하고 다른 모든 행은 그대로 전달합니다.

또는,

awk '$1 == "Count" { $0 = sprintf("Count = %d", ++i) } { print }' rand_file1 >rand_file1.new

값(입력 행)을 수정 $0하고 단일 print.

마지막 변형은 다음과 같이 단축될 수 있습니다.

awk '$1 == "Count" { $0 = sprintf("Count = %d", ++i) } 1' rand_file1 >rand_file1.new

여러분도 구경해 보세요”쉘 루프를 사용하여 텍스트를 처리하는 것이 왜 나쁜 습관으로 간주됩니까?".

답변2

필수 perl답변:

perl -pe 's{^Count\b.*}{"Count = " . ++$i}e'

답변3

짧은awk방법:

awk '$1 == "Count"{ $0 = "Count = "++i }1' file

산출:

Count = 1
Name = Sarah
ID = 113
PhNo =

Count = 2
Name = John
ID = 787
PhNo =

답변4

를 사용 sed하고 seq파이프된 입력을 반복합니다.

t='Count'
seq -f "$t = %g" 70000 | sed -i -e "/^$t/R /dev/stdin" -e "/^$t/d" /tmp/rand_file1

노트:

  • sed~의 R전자헤드중괄호 내에서는 명령이 작동하지 않으므로 {}-e개의 가 필요합니다.
  • 70000충분히 큰 숫자일 수 있습니다. sed중지 되면 중지 seq되므로 더 높은 값도 생성되지 않습니다.

관련 정보