У меня есть файл (data.rdb
) в следующем формате:
col1 col2 col3 col4 col5 col6 col7
aaa1 bbb1 ccc1 ddd1 eee1 fff1 ggg1
aaa2 bbb2 ccc2 ddd2 eee2 fff2 ggg2
aaa3 bbb3 ccc3 ddd3 eee3 fff3 ggg3
Некоторые свойства данных:
- все столбцы разделены табуляцией
- столбцы не имеют одинаковую ширину
- ячейки могут иметь разную длину
- файл будет иметь гораздо больше столбцов, чем представлено, и несколько сотен строк
- предоставленные мною имена столбцов являются общими, настоящие имена могут быть любыми словами, без табуляции, пробелов и специальных символов.
Мне нужно извлечь некоторые столбцы по имени, используя bash, например, col1
, col3
и col6
, где столбцы для выбора берутся из переменной оболочки, определенной как COLUMN_LIST=$@
, где $@
- параметры, передаваемые моему сценарию оболочки.Число и имя параметров могут меняться каждый раз, когда я вызываю скрипт.
Скрипт должен быть в bash, не может быть python или подобным.
Есть идеи?Я думал об использовании awk
/ gawk
, но я не знаю, как выбрать по имени столбца.Порядок столбцов может меняться от файла к файлу.
Спасибо Jorge
ОБНОВЛЕНИЕ
по какой-то причине ни одно из этих решений не работает на моемфайлы реальных данных (т. е. я вообще не получаю вывод), поэтому я публикую подмножество одного из них:
date star jdb texp
2013-11-22 epsInd 2400000.23551544 100.
2013-11-22 epsInd 2400000.23551544 100.
2013-11-22 epsInd 2400000.23551544 100.
2013-11-22 HD217987 2400000.23551544 900.
2013-11-22 TOI-134 2400000.23551544 900.
2013-11-22 tauCet 2400000.23551544 60.
2013-11-22 BD+01316 2400000.23551544 300.
2013-11-22 BD+01316 2400000.23551544 300.
2013-11-22 BD+01316 2400000.23551544 300.
2013-11-22 BD+01316 2400000.23551544 300.
, в этом случае мне будут интересны столбцы star
jdb
и texp
ОБНОВЛЕНИЕ 2
Я использовал код @ EdMorton, и вот результат:
date star jdb texp date star jdb texp
2013-11-22 epsInd 2400000.23551544 100. 2013-11-22 epsInd 2400000.23551544 100.
2013-11-22 epsInd 2400000.23551544 100. 2013-11-22 epsInd 2400000.23551544 100.
2013-11-22 epsInd 2400000.23551544 100. 2013-11-22 epsInd 2400000.23551544 100.
2013-11-22 HD217987 2400000.23551544 900. 2013-11-22 HD217987 2400000.23551544 900.
2013-11-22 TOI-134 2400000.23551544 900. 2013-11-22 TOI-134 2400000.23551544 900.
2013-11-22 tauCet 2400000.23551544 60. 2013-11-22 tauCet 2400000.23551544 60.
2013-11-22 BD+01316 2400000.23551544 300. 2013-11-22 BD+01316 2400000.23551544 300.
2013-11-22 BD+01316 2400000.23551544 300. 2013-11-22 BD+01316 2400000.23551544 300.
2013-11-22 BD+01316 2400000.23551544 300. 2013-11-22 BD+01316 2400000.23551544 300.
2013-11-22 BD+01316 2400000.23551544 300. 2013-11-22 BD+01316 2400000.23551544 300.
ОБНОВЛЕНИЕ3
В итоге я использовал версию Edmorton awk
- в основном для гибкости вывода - но с модификацией, которую я не хочу выводить неверными столбцами:
BEGIN {
numCols = split(column_list,cols)
OFS="\t"
}
{ sub(/\r$/,"") }
NR==1 {
for (fldNr=1; fldNr<=NF; fldNr++) {
f[$fldNr] = fldNr
}
}
{
for (colNr=1; colNr<=numCols; colNr++) {
colName = cols[colNr]
colVal = (colName in f ? $(f[colName]) : "")
printf "%s%s", colVal, (colNr<numCols ? OFS : ORS)
}
}
Основная проблема, которую я получил, состояла в том, что строка заголовка не была разделена табуляцией и, как таковая, разбивка столбцов не работала.Простой способ обнаружить символы табуляции / не-табуляции:
tr $'\t' '#' < data.rdb | head -2
, которые были указаны в одном из моих тестовых файлов:
date star jdb texp
2013-11-22#epsInd#2400000.23551544#100.