텍스트 처리 시 파일의 과도한 사용을 줄입니다.

텍스트 처리 시 파일의 과도한 사용을 줄입니다.

Results.txt현재 27,000줄의 파일()이 있습니다. 파일의 내용은 다음과 같습니다.

45008657        |       A.      |               |       Long    |       0
49210987        |       A.      |               |       Steven  |       3262
49600694        |       A.      |               |       Steven    |       4772
467814  |       A.      |       Rafeal    |       Nadal|       4133
53111047        |       A.      |       Mike    |       Tyson  |       13484

아래와 같이 추가 공백을 제거해야 합니다.

cat Results.txt | tr -d " \t\r" > Results1.txt

파일( Results1.txt)은 추가 공백 없이 깔끔하게 포맷되었습니다.

45008657|A.||Long|0
49210987|A.||Steven|3262
49600694|A.||Steven|4772
467814|A.|Rafeal|Nadal|4133
53111047|A.|Mike|Tyson|13484

이제 모든 문자를 소문자로 변환하고 2열을 4열에 추가해야 합니다.

awk 'BEGIN { FS = "|" } ; { print $1"|"tolower($2) tolower($3) tolower($4)"|"$5 }' Results1.txt > Results2.txt

Results2.txt파일은 아래와 같습니다.

45008657|a.long|0
49210987|a.steven|3262
49600694|a.steven|4772
467814|a.rafealnadal|4133
53111047|a.miketyson|13484

Results.txt초기 파일 자체 내에서 위의 모든 단계를 수행할 수 있는 방법이 있습니까? 나중에 디버깅하기 쉽도록 파일의 남용을 줄이고 싶습니다.

편집하다: 새 파일을 만든 후 파일을 한 번만 삭제하고 싶지 않을 뿐입니다. 이것은 나에게 우아한 해결책이 아닌 것 같습니다.

답변1

GNU 사용 sed:

sed -i 's/\s//g;s/\(|[^|]*\)|\([^|]*\)|/\1\2/;s/.*/\L&/' Results.txt

답변2

실제로 임시 파일은 필요하지 않습니다.

awk -F'|' '{gsub("[ \t\r]", "", $0)}{print $1,tolower($2$3$4),$5}' OFS='|' inputfile

표현식의 첫 번째 부분은 사용자가 수행하는 작업을 수행합니다 tr. 두 번째 부분은 필드 2-4를 결합하고 이를 소문자로 만든 다음 다른 두 필드와 함께 인쇄합니다.

귀하의 입력에 대해 다음이 생성됩니다.

45008657|a.long|0
49210987|a.steven|3262
49600694|a.steven|4772
467814|a.rafealnadal|4133
53111047|a.miketyson|13484

GNU awk 4.1.0 이상에서는 내부 편집을 지원합니다. 당신은 말할 수 있습니다 :

awk -i inplace -F'|' '{gsub("[ \t\r]", "", $0)}{print $1,tolower($2$3$4),$5}' OFS='|' inputfile

답변3

초기 시도에 따라 이 유틸리티를 사용하면 모든 명령을 동일한 파이프에 넣을 수 있습니다 sponge.

cat Results.txt |
  tr -d " \t\r" |
  awk 'BEGIN { FS = "|" } ;
    { print $1"|"tolower($2) tolower($3) tolower($4)"|"$5 }' |
    sponge Results.txt

spongestdin입력이 끝날 때까지 메모리에 저장한 다음 파일에 씁니다. 이는 위 크기의 파일에 허용됩니다.

대신 쉘 리디렉션을 사용하여 파일을 입력할 수도 있습니다 td. cat예를 들면 다음과 같습니다.

tr -d " \t\r" <Results.txt

답변4

내부 편집이 가능한 도구를 사용하면 됩니다. Perl을 예로 들어 보겠습니다.

perl -i -F'\|' -lane 's/[ \t]+//g for @F; print lc("$F[0]|$F[1]$F[2]$F[3]|$F[4]")' a
  • 공개된 -i내부 편집 및 변경 사항은 원본 파일에 직접 적용됩니다(즉, perl임시 파일 생성 및 삭제가 처리됩니다).

  • -a지정된 문자에 대한 자동 분할을 켜고 -F필드가 배열에 저장됩니다 @F.

  • 공백과 탭을 모두 제거 s/[ \t]+//g하고 lc()모두 소문자로 만듭니다.

관련 정보