結果:

結果:

基本から始めましょう。数字、1 つ以上のスペース、ファイル名 (パスを含む) で構成されるファイルがあります。ファイル名とパスにもスペースを含めることができます。

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使用できることです。ここでは 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、最初の変数は2番目の変数のみを使用しているため間違っています。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

関連情報