결과:

결과:

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

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

관련 정보