Как связать переменное количество csv, удалив их строки заголовков?

Если вы хотите сохранить pacman от градации вверх/вниз некоторых пакетов, вы ставите строку в /etc/pacman. conf:

# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
#IgnorePkg   =
#IgnoreGroup =

Я думаю, что вы хотите, чтобы такая строка была в pacman.conf:

IgnorePkg = linux linux-headers linux-api-headers 

Как вы указываете, это просто удерживает pacman от любого апгрейда. Возможно, вы могли бы написать такой код:

if pacman -Qu | egrep -q -s 'linux|linux-headers|linux-api-headers'
then
    pacman -S --noconfirm linux
    pacman -S --noconfirm linux-headers
    pacman -S --noconfirm linux-api-headers
fi

Похоже, вам нужно написать "systemd unit file" - эта часть немного выходит за рамки того, в чем я уверен, указывая вам, что делать. Я думаю, что строка Before=shutdown.target в юнит-файле - это то, что заставляет его работать при выключении. Единственный юнит-файл, который я написал, потребовал от меня нескольких попыток, так что я действительно не думаю, что вам нужен мой совет по этому поводу.

0
13.02.2015, 01:55
3 ответа

Рабочий кодекс для всех, кто только что пришел сюда для копирования-пасты на основе Wartel's:

#!/bin/bash
for i in {01..84}; do
    #declare array to store files with same prefix
    declare -a files=()
    echo "Processing $i"
    for j in `ls $i*.csv`; do
        #add files with same prefix to array
        files=("${files[@]}" "$j")
    done
    #cat first file including header with the rest of the files without the headers
    if [ ${#files[@]} -gt 1 ]; then
        cat <(cat ${files[@]:0:1}) <(tail -q -n+2 ${files[@]:1}) > "$i".csv
    else
        cat <(cat ${files[@]:0:1}) > "$i".csv
    fi
done

Стефана Chazelas 'Way, используя awk. Намного чище.

#!/bin/bash
for i in {01..84}; do
        echo "processing $i"
        awk 'NR==FNR||FNR>1' $i?*.csv >> "$i".csv
done
0
28.01.2020, 02:20
#!/bin/sh
for i in {01..84}
do
  cat $i*.csv > $i.csv-concat
  rm $i*.csv
  mv $i.csv-concat $i.csv
done

Не забывайте кошку, это инструмент конкатенации, Хвост также может выполнять работу и удалить заголовок.

#!/bin/sh
pushd [workdir]
for i in {01..84}
do
  echo $i*.csv | xargs -n 1 tail -n+2 > $i.csv-concat
  rm $i*.csv
  mv $i.csv-concat $i.csv
done
popd
1
28.01.2020, 02:20
#!/bin/bash
for i in {01..84}; do
    x=$(printf '%02d' $i)
    set -- $x?*.csv
    if [ -f "$1" ]; then
        cp "$1" $i.csv
        shift
        if [ -f "$1" ]; then
            tail -q -n +2 "$@" >> $x.csv
        fi
    fi
done

Для каждого префикса он устанавливает список файлов с этим префиксом в качестве аргументов, так что вы можете использовать $1 для доступа к первому и т.д.

Если $1 - это файл (чтобы поймать случай, когда нет файлов с данным префиксом), то скопируйте этот файл в prefix.csv. Затем проверьте, было ли более одного файла с таким префиксом, сдвинув первый файл и проверив, что следующий также является файлом. Если да, пропустите строку заголовка каждого файла с помощью команды tail и добавьте ее в файл prefix.csv.

Опция -q к tail предназначена для подавления строки заголовка, которую добавляет сам tail, если в списке аргументов передано более одного файла; именно отсюда взялись ваши строки ==> 19XXX.csv <==.

Возможно, в вашем решении нужна только опция -q, но я нахожу ее слишком сложной, требующей от bash буферизации вывода команды tail и т.д., что может быть причиной преждевременной остановки (краха?) скрипта.

EDIT: добавлено x=$(printf '%02d' $i), так как {01..84} расширяется до 1 2 3 ... без ведущих нулей.

3
28.01.2020, 02:20

Теги

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