awk 현장 작업

awk 현장 작업

전체 경로가 포함된 파일이 있습니다.

/home/usr/file_name_delimited_by_underscore_123.txt  
/home/usr/another_example_456.rar

확장자 없이 경로에서 파일 이름을 인쇄하고 그 옆에 있는 마지막 파일 이름을 인쇄하고 싶습니다 _.

산출:

file_name_delimited_by_underscore_123 123
another_example_456 456

파이프된 awk 명령을 사용하여 원하는 출력을 얻는 방법을 알아냈습니다.

cat file | awk -F[/.] '{print $(NF-1)}' | awk -F_ '{print $0" "$NF}'

파이프를 사용하지 않고 이를 달성할 수 있는 방법이 있습니까?

내 질문은 awk로 구문 분석된 필드에서 작업을 수행할 수 있습니까?로 요약됩니다.

당신의 도움을 주셔서 감사합니다.

답변1

네, 현장에서는 원하는 대로 무엇이든 할 수 있습니다. 예를 들어:

$ cat file | awk -F[/.] '{n = split($(NF-1),a,/_/); print $(NF-1)" "a[n]}'
file_name_delimited_by_underscore_123 123
another_example_456 456

물론 이것이 필요하지는 않습니다 . 파일을 직접 읽을 cat수 있습니다 . 기본 출력 필드 구분 기호 는 공백이므로 결과를 문자열 연결보다는 별도의 출력 필드로 작성하는 것이 더 관용적입니다.awkOFS

awk -F[/.] '{n = split($(NF-1),a,/_/); print $(NF-1), a[n]}' file

답변2

모든 sed의 경우:

$ sed 's:.*/\(.*_\(.*\)\)\..*:\1 \2:' file
file_name_delimited_by_underscore_123 123
another_example_456 456

답변3

당신은 그것을 사용할 수 있습니다 sed:

$ sed -e 's;^.*/\(.*_\)\([0-9]*\)\.[^\.]*$;\1_\2 \2;' file
file_name_delimited_by_underscore_123 123
another_example_456 456

^.*/경로를 삭제합니다.

\(.*_\)마지막 밑줄까지 이름을 캡처합니다.

\.[^\.]*확장 프로그램을 제거하세요.

\1\2 \2캡처된 그룹으로 대체되었습니다.

관련 정보