전체 경로가 포함된 파일이 있습니다.
/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
수 있습니다 . 기본 출력 필드 구분 기호 는 공백이므로 결과를 문자열 연결보다는 별도의 출력 필드로 작성하는 것이 더 관용적입니다.awk
OFS
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
캡처된 그룹으로 대체되었습니다.