CAT 2 регистрирует, и избегайте дублирования строк

Проблема - Вы, используют относительные пути, но Вы изменяете каталоги посреди сценария. Если Вы мысленно прослеживаете через шаги:

# command                     # relevant absolute path(s)
./script.sh ./bla/bla/bla/    # PWD/script.sh 
mkdir -p ./bla/bla/bla/       # PWD/bla/bla/bla/
cd ./release/                 # PWD/release
cp -rf ./html/ ./bla/bla/bla/ # PWD/release/html PWD/release/bla/bla/bla   

Заметьте, как Вы создали PWD/bla/bla/bla/ но пытаются скопировать в PWD/release/bla/bla/bla/. Необходимо удостовериться mkdir и cp происходите в том же каталоге.


Вот предложенная альтернатива. Я заменил все run () функция с опциями оболочки xtrace (-x), который отображает каждую команду, прежде чем она будет выполнена, и errexit (-e), который выходит, если какая-либо команда возвращает ошибку.

#!/bin/bash -xe

cd ./release/

if [ ! -d "$1" ]; then
        mkdir -p "$1"
fi
cp -rf ./html "$1"
1
22.07.2013, 14:13
3 ответа

Это не сохраняет порядок строк, но это не было требованием

awk '{line[$1]=$0} END {for (key in line) print line[key]}' file1 file2
3
27.01.2020, 23:13
$ awk -F, 'NR==FNR{a[$1]=$0;next};$1 in a {$0=a[$1]}; 1' file2 file1
{"name":"clio5", "value":"14"}
{"name":"citroen_c4", "value":"25"}
{"name":"citroen_c3", "value":"12"}
{"name":"golf4", "value":"18"}
{"name":"golf3", "value":"8"}

Это принимает это file2 только записи обновлений, которые уже найдены в file1. Если file2 может вставить новые записи, можно хотеть изменить его на:

awk -F, '
  NR==FNR{a[$1]=$0;next}
  $1 in a {$0=a[$1];delete a[$1]}
  1
  END{for (i in a) print a[i]}' file2 file1

Порядок, в котором отображены вставленные записи, является неуказанным. Вышеупомянутое предполагает, что существует только одна запись на имя в каждом файле.

3
27.01.2020, 23:13

Если порядок не важен, эти команды должны сделать это:

cat file2 file1 > files
cut -f2 -d: files | cut -f1 -d, | sort | uniq > pat
for i in $(cat pat); do grep $i files -m 1; done

Первая команда присоединяется к входным файлам (порядок важен; file2 идет сначала, потому что его значения переопределят тех в file1).

Вторая команда сокращает автомобильные бренды из входных файлов, видов и удаляет дубликаты и хранит их в pat файл.

Третья команда захватывает каждый шаблон на объединенном входном файле и остановки на первом соответствии, поэтому если тот же автомобильный бренд появляется на обоих файлах, только тот в file2 печатается.

Если порядок важен, и все шаблоны находятся в file1, можно использовать просто file1 во второй команде (вместо файлов) и опустить sort и uniq команды.

1
27.01.2020, 23:13
  • 1
    Вместо того, чтобы делать временный файл, можно передать по каналу к циклу: ...sort | uniq | while read i ; do.... Кроме того, можно передать вывод по каналу cat кому: cut: cat file2 file1 | cut -f2 -d: | .... –   22.07.2013, 16:32
  • 2
    @EvanTeitelman, Спасибо. Я предположил, что будет более компактный путь, но я боялся, что это будет менее читаемо. –  Paulo Almeida 22.07.2013, 16:49

Теги

Похожие вопросы