從基礎知識開始,我有一個文件,其中包含一個數字、一個或多個空格,然後是文件名稱(包括路徑)。檔案名稱和路徑也可以包含空格。
我想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
以及$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
去掉了斜杠,第一個變數也是錯誤的,因為它只使用了第二個變量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