정보를 입력 및 출력 필드로 분리하는 방법은 무엇입니까?

정보를 입력 및 출력 필드로 분리하는 방법은 무엇입니까?
$ stat -c "%Y#%n#%y" *  | awk -F'#' "BEGIN {OFS=\"|\"} NR==1,NR==3 {print \$2 \$3}"
directory1/Blum2017-12-22 22:33:38.644178442 -0500
dir2/Ciolli2017-12-22 21:53:51.769368496 -0500
Dar2017-12-06 13:29:37.698296879 -0500

입력 및 출력 필드 구분 기호를 설정하려고 합니다.

  • 입력 구분 기호로 사용하고 있지만 #파일 이름에 #. stat출력 경로 이름을 as로 구분할 수 있는지 , 입력 필드 구분 기호가 허용되는지 여부는 알 수 없습니다./nullfindawk\null

  • 내 설정이 작동 OFS하지 않는 이유는 무엇입니까 |?

감사해요.

답변1

stat -c "%Y/%n/%y" * | awk -F'/' 'NR==1,NR==3 {print $2"|"$3}'

또는:

stat -c "%Y/%n/%y" * | awk -F'/' 'BEGIN {OFS="|"} NR==1,NR==3 {print $2,$3}'

설명하다:

#/(디렉토리 구분 기호) 는 파일 이름의 일부가 될 수 없으므로 대신 사용할 수 있습니다 .

입력 awk필드 구분 기호는 그에 따라 설정되어야 합니다: -F'/'.

이미 댓글에서 지적했듯이@스틸드라이버에서는 출력 필드 구분자를 선택하는 두 가지 방법이 있습니다.

  1. 문자열 연결 사용: print $2"|"$3.
  2. OFS="|"그런 다음 정의하십시오 print $2,$3.

저는 큰 따옴표 '대신 작은 따옴표를 선택했습니다 ". 그러면 이 경우 이스케이프 필요성이 줄어듭니다.

고쳐 쓰다:

이제 질문에서는 stat출력에 디렉터리 구분 기호가 포함될 수 있다고 지정하므로 /레코드 구분 기호에 대한 현명한 선택은 아닙니다. 내가 아는 한, 파일 이름에 허용되지 않는 유일한 문자는 이지만 NUL, 적어도 이 경우에는 그 사용에 문제가 있습니다. 내 제안은 파일 이름의 일부로 발견될 가능성이 없는(허용되기는 하지만) 어색한 문자열을 구성하는 것입니다. 놀랍게도 \x0(의 표현 NUL)이 좋은 선택일 수 있습니다.

stat -c "%Y\x0%n\x0%y" * | awk -F\x0 'BEGIN {OFS="|"} NR==1,NR==3 {print $2"|"$3}'

관련 정보