从基础知识开始,我有一个文件,其中包含一个数字、一个或多个空格,然后是文件名(包括路径)。文件名和路径也可以包含空格。
我想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