Начнем с основ: у меня есть файл, в котором есть номер, один или несколько пробелов, а затем имя файла (включая путь). Имя файла и путь также могут содержать пробелы.
Я хочу использовать их 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