Как преобразовать несколько столбцов в последовательные строки в awk

Эта команда загружает пакет.deb с информацией о репозитории CUDA

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-repo-ubuntu1804_10.1.243-1_amd64.deb

dpkg— менеджер пакетов для Debian. Опция -Я установлю ранее загруженный пакет

sudo dpkg -i cuda-repo-ubuntu1804_10.1.243-1_amd64.deb

apt-key— утилита управления ключами APT. advкоманда передает расширенные параметры в gpg.

sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub

.

why do we run sudo dpkg -i for the first.deb file and sudo apt install for the second?

apt— интерфейс для dpkg. Он может разрешать зависимости, загружать и устанавливать необходимый пакет. Вероятно, у первого файла.deb нет зависимостей, а у второго — нет.

why we don't add a key from the second repo, but only from the first one

Поскольку у них один и тот же открытый ключ

1
14.09.2020, 16:22
3 ответа

Нет awk,но используя Миллера , учитывая

$ cat file
    Cycle  A1  A2  B1
    1      4   5   2
    2      7   3   4
    3      3   2   5

, затем

$ mlr --pprint --ifs tab reshape -i A1,A2,B1 -o Well,Value then sort -f Well then reorder -f Well file
Well Cycle Value
A1   1     4
A1   2     7
A1   3     3
A2   1     5
A2   2     3
A2   3     2
B1   1     2
B1   2     4
B1   3     5

Вы можете пропустить шаг sort, если он не является обязательным.

Команда Miller reshapeтакже может принимать регулярное выражение для выбора поля, например.

reshape -r '[A-Z][1-9]' -o Well,Value
1
18.03.2021, 23:04

Вот один (довольно грубый )подход, который требует, чтобы заголовки были статическими и известными заранее, и который плохо сортируется:

$ awk -F'\t' -v OFS="\t" 'BEGIN{print "Well","Cycle","Value"}
                         NR>1{
                            cycle[NR]=$2;
                            a1[NR]=$3; 
                            a2[NR]=$4; 
                            b1[NR]=$5;
                        }
                        END{
                            for(line in cycle){
                                print "A1",cycle[line],a1[line]; 
                                print "A2",cycle[line],a2[line]; 
                                print "B1",cycle[line],b1[line]
                            }
                        }' file 
Well    Cycle   Value
A1  1   4
A2  1   5
B1  1   2
A1  2   7
A2  2   3
B1  2   4
A1  3   3
A2  3   2
B1  3   5

Если вам нужно хорошо отсортировать, вы можете использовать еще более грубый:

$ awk -F'\t' -vOFS="\t" 'BEGIN{print "Well","Cycle","Value"}
                         NR>1{
                            cycle[NR]=$2;
                            a1[NR]=$3; 
                            a2[NR]=$4; 
                            b1[NR]=$5;
                        }
                        END{
                            for(line in cycle){
                                print "A1",cycle[line],a1[line];
                            }
                            for(line in cycle){
                                print "A2",cycle[line],a2[line]; 
                            }
                            for(line in cycle){
                                print "B1",cycle[line],b1[line]
                            }
                        }' file 
Well    Cycle   Value
A1  1   4
A1  2   7
A1  3   3
A2  1   5
A2  2   3
A2  3   2
B1  1   2
B1  2   4
B1  3   5
0
18.03.2021, 23:04

Сначала мы загружаем файл в массив массивов AoA[colidx, rowidx] Затем в конце файлового блока мы реструктурируем эти данные в желаемом формате.

Примечание:

  • разделитель полей — это \t+для обхода последовательных вкладок и не передачи пустых полей.
  • Часть gsub()предназначена для удаления первых n конечных вкладок.
  • Этот код будет обрабатывать столько столбцов и строк, сколько есть в файле. (память позволяет)
awk -F '\t+' '
gsub(/^\t|\t$/, "") {$1=$1}
NR==1 {header = "Well" OFS $1 OFS "Value"}
{
  for(i=1; i<=NF; i++) {
    AoA[i, NR] = $(i)
  }
}
END {
  print header
  for(col=2; col<=NF; col++) {
    for(row=2; row<=NR; row++) {
      well  = AoA[col, 1]
      cycle = AoA[1, row]
      value = AoA[col, row]
      print well, cycle, value
    }
  }
}
' OFS='\t' -  | column -t

Результаты:

Well  Cycle  Value
A1    1      4
A1    2      7
A1    3      3
A2    1      5
A2    2      3
A2    3      2
B1    1      2
B1    2      4
B1    3      5
1
18.03.2021, 23:04

Теги

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