Я хочу объединить строки с одним и тем же первым столбцом (A), но все остальные 16 столбцов разные, и я хочу сохранить всю информацию в одной строке
У вас есть несколько хороших ответов, но я хочу указать вам, что то, что вы описали в этих 30 словах, известно в SQL как соединение . Если вы импортируете свои 50 000 строк в две таблицы в SQLite, вы получите желаемый эффект с
select * from R join S on r1 = s1
, где r1 и s1 - имена столбцов, которые вы определяете.
У использования SQL для чего-то подобного есть много преимуществ, особенно когда критерии объединения и выбора становятся более сложными. Это одна из причин изобретения SQL.
Чтобы указать имя файла в качестве аргумента скрипта, вам необходимо использовать позиционные параметры
Для этого можно использовать следующий скрипт:
#!/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