基本から始めましょう。数字、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 セットのファイルを比較しているので、まずこのコンポーネントを理解する必要があります。$3
awk
$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