결과:

결과:

기본 사항부터 시작하여 숫자, 하나 이상의 공백, 파일 이름(경로 포함)이 포함된 파일이 있습니다. 파일 이름과 경로에는 공백이 포함될 수도 있습니다.

awk별도의 파일에서 이러한 필드 간의 동일성을 추가로 테스트할 때 별도의 구성 요소를 사용하고 싶습니다 .

첫 번째 문제를 다루는 파일은 다음과 같습니다.

111  aaa/aaa
222  b b/bbb
333  ccc/c c
444  d d/d d

출력을 보고 싶습니다.

aaa/aaa 111
b b/bbb 222
ccc/c c 222
d d/d d 222

여기서 핵심은 위 출력 형식이 아니라 이러한 변수를 설정한 후 표현식에 사용할 수 있는 기능 등 입니다 $1. 여기에는 파일이 하나뿐이지만 실제로는 두 세트의 파일을 비교하고 있지만 먼저 이 구성 요소를 이해해야 합니다.$2$3awk

$1줄 시작 부분에 영숫자 시퀀스를 포함해야 하며, $2파일 이름 없이 전체 경로를 포함해야 하며, $3파일 이름만 포함해야 합니다.

프로그램 중에 변경을 시도했지만 FS이런 일이 발생하지 않았습니다.

$ awk 'BEGIN{OFS=" || "}{FS=" ";a[$1]=1;FS="/";b[$NF]=1;print $1, $2, $NF}' file1
111 || dir1/a || aa
222 dir1 || bbb || bbb
333 dir1 || c cc || c cc
444 dir1 || ddd || ddd
555 dir2 || e ee || e ee
666 dir2 || fff || fff
999 dir2 || zzz || zzz

FS슬래시가 제거되었을 뿐만 아니라 첫 번째 변수도 두 번째 변수만 사용하기 때문에 잘못된 것입니다.FS

답변1

왜 이렇게 해야 하는지는 잘 모르겠지만 (예를 들어) 명시적인 공백 구분 기호를 저장하고 제거한 $1다음 대체 구분 기호를 사용하여 나머지를 분할할 수 있습니다. 예를 들어:

$ awk '
   {
      a=$1; $1=""; sub(/^ */,""); 
      n=split($0,p,"/"); 
      $1=a; for(i=1;i<=n;i++) $(i+1) = p[i]
   } {
     print $2"/"$3, $1
   }' file
aaa/aaa 111
b b/bbb 222
ccc/c c 333
d d/d d 444

답변2

while read -r f1 fpath; do
   printf '%s\t%s\n' "$fpath" "$f1"
done < file1

당신이 무엇을 추구하는지 잘 모르겠지만 필요한 것보다 더 복잡하게 만들고 있습니다.

결과:

aaa/aaa 111
b b/bbb 222
ccc/c c 333
d d/d d 444

관련 정보