파일 줄에서 마지막 n 문자 제거

파일 줄에서 마지막 n 문자 제거

data_list.txt저는 Mac 터미널(bash)을 사용하고 있으며 다음과 같은 줄이 포함 된 파일이 있습니다 n.

aaabbbccc_7777.txt 
nnhhaa_8888.txt 
ayquabay_9999.txt 
ayqynbnbn_1122.txt 
ooppaa_3454.txt

각 줄의 마지막 8자를 어떻게 제거합니까?

예상 출력 data_list.txt:

aaabbbccc_ 
nnhhaa_ 
ayquabay_ 
ayqynbnbn_ 
ooppaa_

당신의 도움에 감사드립니다

답변1

마지막 8자를 제거하거나 8자 미만인 경우 모두 제거하려면 다음을 수행할 수 있습니다.

sed "s/.\{0,8\}$//; /^$/d" data_list.txt

정규식을 확장할 필요가 없습니다. 이렇게 하면 가능한 한 많은 문자가 지워지지만 8자 이하입니다. 빈 줄이 남아 있으면 출력에서 ​​제거됩니다.

후행 공백을 제거해야 하는 경우(8자 내에 포함하지 않음) 다음을 수행할 수 있습니다.

sed "s/.\{0,8\}[[:space:]]*$//" data_list.txt

마지막에 제거해야 하는 실제 기준이 무엇인지 추측할 수 있습니다(예: 밑줄 뒤의 모든 항목 또는 숫자 + 확장자). 그러나 파일 확장자와 그 앞의 숫자를 제거하려는 경우:

sed "s/[[:digit:]]*\..*$//" data_list.txt

다른 답변에서는 이미 밑줄 뒤의 모든 항목을 제거하는 방법을 보여 주었으므로 반복하지 않겠습니다.

답변2

정확한 입력을 위해(마지막 줄을 제외한 모든 줄 끝에 공백이 있음) 이것을 사용할 수 있습니다("after_part"를 제거하고 싶은 것 같습니다:

sed 's/........ *$//' data_list.txt

마지막 "밑줄" 문자 뒤의 내용을 제거하려면 다음 명령을 사용하십시오.

sed 's/\(.*_\).*$/\1/' data_list.txt

sed는 "탐욕적"이므로 "밑줄" 문자가 여러 개 있는 줄에서도 작동합니다. 이것이 MacOS에서 작동할지는 모르겠지만 적어도 Google 검색 엔진이 여기에 도착하므로 Linux sed 사용자에게는 유용할 것입니다...

답변3

다음은 100,000줄이 포함된 샘플 파일을 사용하여 awkfrippe의 방법만큼 빠른 솔루션 입니다.sed

time awk '{print substr($0, 1, length($0)-8)}' 100k.txt

real    0m4.110s
user    0m0.142s
sys     0m0.422s

time sed "s/.\{0,8\}$//; /^$/d" 100k.txt

real    0m4.043s
user    0m1.558s
sys     0m0.345s

임의의 숫자로 바꾸십시오 8. 여기서 주요 차이점은 awk트림 길이가 행 길이를 초과하는 경우 개행 문자가 인쇄되는 반면 개행 문자는 인쇄 sed되지 않는다는 것입니다.

답변4

Raku(이전 Perl_6) 사용

raku -ne '.trim-trailing.chop(8).put;'

또는

raku -pe '.=trim-trailing; .=chop(8);'

입력 예:

wxxyyyzzzz_1234.txt
aaabbbccc_7777.txt 
nnhhaa_8888.txt 
ayquabay_9999.txt 
ayqynbnbn_1122.txt 
ooppaa_3454.txt

예제 출력:

wxxyyyzzzz_
aaabbbccc_
nnhhaa_
ayquabay_
ayqynbnbn_
ooppaa_

위의 두 답변 모두 Raku의 trim-trailing루틴을 사용하여 후행 공백을 제거합니다. trim-trailing문자열 오른쪽 끝에 있는 -ped 문자 수를 자유롭게 제거 및/또는 조정하세요 .chop

https://docs.raku.org/routine/chop
https://raku.org

관련 정보