Чтение аргумента и создание из него временного файла для использования в сценарии

Я хочу объединить строки с одним и тем же первым столбцом (A), но все остальные 16 столбцов разные, и я хочу сохранить всю информацию в одной строке

У вас есть несколько хороших ответов, но я хочу указать вам, что то, что вы описали в этих 30 словах, известно в SQL как соединение . Если вы импортируете свои 50 000 строк в две таблицы в SQLite, вы получите желаемый эффект с

select * from R join S on r1 = s1

, где r1 и s1 - имена столбцов, которые вы определяете.

У использования SQL для чего-то подобного есть много преимуществ, особенно когда критерии объединения и выбора становятся более сложными. Это одна из причин изобретения SQL.

0
20.04.2019, 11:05
1 ответ

Чтобы указать имя файла в качестве аргумента скрипта, вам необходимо использовать позиционные параметры

Для этого можно использовать следующий скрипт:

#!/bin/bash

awk '{ print NF; exit }' "$1"

Предполагается, что вас интересует только количество столбцов в первой строке.


Если вы хотите найти строку с наибольшим количеством столбцов, вы можете:

#!/bin/bash

awk 'NF > max { max = NF } END { print max }' "$1"

Это проверит длину всех строк в файле и напечатает самую длинную


Теперь, если вы хотите указать разделитель, вы можете использовать несколько позиционных параметров.:

#!/bin/bash

delim=$1
file=$2

awk -F "$delim" 'NF > max { max = NF } END { print max }' "$file"

Это позволит вам подсчитать максимальный размер столбца во всех типах файлов, таких как csv:

./columnCounter, tempfile.csv

Чтобы получить еще больше фантазии, мы могли бы использовать getoptsдля разбора аргументов:

#!/bin/bash

while getopts d:f: opt; do
    case $opt in
        d)  delim=$OPTARG;;
        f)  file=$OPTARG;;
    esac
done

awk -F "$delim" 'NF > max { max = NF } END { print max }' "$file"

Тогда это будет называться как:

./columCounter -d, -f tempfile.csv
1
28.01.2020, 02:40

Теги

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