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
sponge
stdin
입력이 끝날 때까지 메모리에 저장한 다음 파일에 씁니다. 이는 위 크기의 파일에 허용됩니다.
대신 쉘 리디렉션을 사용하여 파일을 입력할 수도 있습니다 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()
모두 소문자로 만듭니다.