На мой взгляд, самый простой и читаемый подход:
вырезать
) tail
) paste
) Пример: ваш пример входного файла:
abc 123
abc 789
bcd 456
acb 135
Затем выполните следующую команду в терминале
cut -d' ' -f1 in.txt | tail -n +2 | paste -d' ' file -
Вывод:
abc 123 abc
abc 789 bcd
bcd 456 acb
acb 135
Структура этого решения отличается от данных ответов. Нет необходимости в условиях, циклах или регулярных выражениях.
Вы можете сделать это с помощью globs и расширения параметров . Вам не нужно использовать find
, если у вас есть версия bash с globstar
для включения синтаксиса **
(bash4 +).
# Enable `**`, and expand globs to 0 elements if unmatched
shopt -s globstar nullglob
# Put all files matching *.clj or *.cljs into ${files[@]} recursively
files=(dir1/**/*.clj{,s})
# Print all files delimited by newlines, with all leading directories stripped
printf '%s\n' "${files[@]##*/}"
Чтобы применить произвольное преобразование, замените последнюю строку на:
for file in "${files[@]}"; do
some-arbitrary-transformation <<< "$file"
done
shopt -s globstar nullglob
var="$(echo **/*.clj **/*.cljs | xargs -n1 basename)"
echo "$var"