基本から始まる数字、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
。これには1つのファイルしかありませんが、実際には2セットのファイルを比較していますが、まずこのコンポーネントを理解する必要があります。$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