텍스트 파일에서 특정 줄의 고정 부분을 제거하는 방법은 무엇입니까?

텍스트 파일에서 특정 줄의 고정 부분을 제거하는 방법은 무엇입니까?

ls -Rlh /path/to/directory > file저는 일부 하드 드라이브의 내용을 기록하기 위해 일부 텍스트 파일을 사용해 왔습니다 .

텍스트 파일을 만든 후 일부 문자열을 삭제하고 싶습니다.

텍스트 파일의 일부 예는 다음과 같습니다.

external1:
total 36K
drwxrwxr-x 2 emma emma 4.0K Oct 31 01:29 dir1
drwxrwxr-x 2 emma emma  12K Oct 31 01:29 dir2
drwxrwxr-x 2 emma emma  20K Oct 31 01:29 dir3

external1/dir1:
total 4.5M
-rw-rw-r-- 1 emma emma 769K Oct 31 01:12 a001.jpg
-rw-rw-r-- 1 emma emma 698K Oct 31 01:12 a002.jpg
-rw-rw-r-- 1 emma emma 755K Oct 31 01:12 a003.jpg
-rw-rw-r-- 1 emma emma 656K Oct 31 01:12 a004.jpg
-rw-rw-r-- 1 emma emma 756K Oct 31 01:12 a005.jpg
-rw-rw-r-- 1 emma emma 498K Oct 31 01:12 a006.jpg
-rw-rw-r-- 1 emma emma 455K Oct 31 01:12 a007.jpg

external1/dir2:
total 8.7M
-rw-rw-r-- 1 emma emma  952K Oct 31 01:13 a001.jpg
-rw-rw-r-- 1 emma emma  891K Oct 31 01:13 a002.jpg
-rw-rw-r-- 1 emma emma  838K Oct 31 01:13 a003.jpg
-rw-rw-r-- 1 emma emma  846K Oct 31 01:13 a004.jpg
-rw-rw-r-- 1 emma emma  876K Oct 31 01:13 a005.jpg
-rw-rw-r-- 1 emma emma  834K Oct 31 01:13 a006.jpg
-rw-rw-r-- 1 emma emma  946K Oct 31 01:13 a007.jpg
-rw-rw-r-- 1 emma emma  709K Oct 31 01:13 a008.jpg
-rw-rw-r-- 1 emma emma 1007K Oct 31 01:13 a009.jpg
-rw-rw-r-- 1 emma emma  940K Oct 31 01:13 a010.jpg

external1/dir3:
total 4.6M
-rw-rw-r-- 1 emma emma 408K Oct 31 01:15 a001.jpg
-rw-rw-r-- 1 emma emma 525K Oct 31 01:15 a002.jpg
-rw-rw-r-- 1 emma emma 383K Oct 31 01:15 a003.jpg
-rw-rw-r-- 1 emma emma 512K Oct 31 01:15 a004.jpg
-rw-rw-r-- 1 emma emma 531K Oct 31 01:15 a005.jpg
-rw-rw-r-- 1 emma emma 532K Oct 31 01:15 a006.jpg
-rw-rw-r-- 1 emma emma 400K Oct 31 01:15 a007.jpg
-rw-rw-r-- 1 emma emma 470K Oct 31 01:15 a008.jpg
-rw-rw-r-- 1 emma emma 407K Oct 31 01:15 a009.jpg
-rw-rw-r-- 1 emma emma 470K Oct 31 01:15 a010.jpg

실제 텍스트 파일의 길이는 수천 줄이고 크기는 수 메가바이트입니다.

내가 하고 싶은 일은 모든 줄이 파일 크기로 시작되도록 해당 줄에서 파일 크기 이전의 모든 항목을 제거하는 것입니다. 예를 들어

512K Oct 31 01:15 a004.jpg
531K Oct 31 01:15 a005.jpg
532K Oct 31 01:15 a006.jpg
400K Oct 31 01:15 a007.jpg
470K Oct 31 01:15 a008.jpg

그러나 다른 모든 행(디렉터리 이름과 전체 크기 포함)을 그대로 유지하고 싶기 때문에 colrm또는 를 사용할 수 없습니다 cut.

답변1

구문 분석된 출력 ls은 신뢰할 수 없지만 다음과 같은 특별한 경우에는 작동합니다.

sed -e 's/^.*emma emma //' file

이렇게 하면 각 줄에서 "emma emma"까지의 모든 내용이 삭제됩니다. 문자열이 한 줄에 나타나지 않으면 변경되지 않은 것입니다.

내가 작성한 정규식은 emma 뒤의 첫 번째 공백만 제거하여 크기 필드가 오른쪽 정렬을 유지하도록 합니다(예: "709K"와 "1007K"는 모두 한 줄에서 동일한 수의 문자를 사용합니다).

이 작업을 원하지 않으면 다음을 사용하십시오.

sed -e 's/^.*emma emma  *//' file

그러면 다음 필드가 시작될 때까지 emma 뒤의 모든 공백이 제거됩니다.

다음은 어떤 경우에도 작동하는 sed 버전입니다 user group.

sed -e 's/^.\{10\} [0-9]\+ [^ ]\+ [^ ]\+ //' file

출력의 정확한 형식 에 더 의존하므로 ls첫 번째 버전보다 기술적으로 더 나쁩니다. 하지만 특정 파일에서는 작동해야 합니다.

바라보다왜 `ls`를 구문 분석하지 *않나요*?ls 구문 분석이 왜 나쁜지에 대한 정보입니다.


모든 파일이 속하지 않는 경우 emma이와 같은 awk 스크립트를 사용해야 할 수도 있습니다.

awk 'NF>2 {print $5,$6,$7,$8,$9} ; NF<3 {print}' file

필드가 2개 이상인 줄의 경우 필드 5-9만 인쇄합니다. <3개 필드를 포함하는 줄의 경우 전체 줄을 인쇄합니다. 불행하게도 크기 필드의 올바른 정렬이 손실됩니다. awk약간 더 복잡한 스크립트를 사용하여 수정할 수 있습니다.

awk 'NF>2 {printf "%5s %s %s %s %s\n", $5, $6, $7, $8, $9} ; NF<3 {print}' file 

이 최종 버전은 jasonwryan의 답변에 있는 for 루프를 통합하므로 단일 공백이 포함된 파일 이름을 처리할 수 있습니다(G-Man이 언급한 것처럼 연속 공백은 제외).

awk 'NF>2 {printf "%5s", $5; for(i=6;i<=NF;i++){printf " %s", $i}; printf "\n"} ; NF<3 {print}' file 

답변2

awk를 사용하세요:

awk '{if ($1 ~/^-|d/) {for(i=5;i<=NF;i++){printf "%s ", $i}; printf "\n"} else print $0}' file

첫 번째 필드가 -또는 로 시작 하면 d다섯 번째 필드부터 마지막 ​​필드까지 인쇄하고, 그렇지 않으면 전체 레코드를 인쇄합니다.

답변3

-o100MB의 데이터에 대해 이야기하고 있으므로 gnu ls 및 -g옵션을 사용하여 사용자 및 그룹을 인쇄하지 않고 다음 형식을 얻는 것이 좋습니다 .

-rw-rw-r-- 1 952K Oct 31 01:13 a001.jpg

이 sed 명령은 줄 시작 부분에서 불필요한 데이터를 제거합니다.

sed 's/^[-a-z]{10} \{1,\}[0-9]\{1,\}//'

원치 않는 데이터 나열 및 제거를 한 단계로 결합할 수 있으며(이 방법은 이 페이지에 있는 대부분의 솔루션에도 적용됨) 시간도 절약됩니다.

ls -Rlhog /path/to/directory | sed 's/^[-a-z]\{10\} \{1,\}[0-9]\{1,\}//' > file

관련 정보