Создайте столбец для каждого файла, соответствующего глобусу - PullRequest
0 голосов
/ 07 февраля 2019

У меня трудности с чем-то, что звучит относительно просто.У меня есть несколько файлов данных с отдельными значениями, как показано ниже:

data1.txt:

100

data2.txt

200

data3.txt

300

У меня есть другой файл с именем header.txt и его файл шаблона, который содержит заголовок, как показано ниже:

Data_1    Data2   Data3
-         -       -

Я пытаюсь добавить данные из данных *TXT-файлы до последней строки Master.txt

Желаемый вывод будет выглядеть примерно так:

Data_1    Data2   Data3
-         -       -
100       200     300

Я активно работаю над этим, поэтому я не уверен, с чего начать,Это не нужно реализовывать в чистой оболочке - использование стандартных инструментов UNIX, таких как awk или sed, вполне разумно.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

paste является ключевым инструментом:

#!/bin/bash
exec >>Master.txt
cat header.txt
paste $'-d\n' data1.txt data2.txt data3.txt |
while read line1
do
    read line2
    read line3
    printf '%-10s %-10s %-10s\n' "$line1" "$line2" "$line3"
done
0 голосов
/ 07 февраля 2019

В качестве собственной реализации bash:

#!/usr/bin/env bash
case $BASH_VERSION in ''|[123].*) echo "ERROR: Bash 4.0+ needed" >&2; exit 1;; esac

declare -A keys=( )       # define an associative array (a string->string map)
for f in data*.txt; do    # iterate over data*.txt files
  name=${f%.txt}          # for each, remove the ".txt" extension to get our name...
  keys[${name^}]=$(<"$f") # capitalize the first letter, and read the file to get the value
done

{                                       # start a group so we can redirect output just once
  printf '%s\t' "${!keys[@]}"; echo     # first line: keys in our associative array
  printf '%s\t' "${keys[@]//*/-}"; echo # second line: convert values to dashes
  printf '%s\t' "${keys[@]}"; echo      # third line: print the values unmodified
} >>Master.txt                          # all the above with output redirected to Master.txt

Большую часть волшебства здесь выполняют расширения параметров :

  • ${f%.txt} обрезает расширение .txt с конца $f
  • ${name^} с заглавной буквы первой буквы $name
  • "${keys[@]}" расширяется до всех значений в массиве с именем keys
  • "${keys[@]//*/-} заменяет * (все) в каждом ключе на фиксированную строку -.
  • "${!keys[@]}" расширяется до имен записей вассоциативный массив keys.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...