У меня есть файл (data.rdb) в следующем формате:
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.
некоторые свойства:
- все столбцы разделены табуляцией
- столбцы не имеют одинаковую ширину
- ячейки могут иметь разную длину
- файл будет иметь гораздо больше столбцов, чем представлено, и несколько сотен строк
- столбцыИмена могут быть любыми словами без символов табуляции, пробелов или специальных символов
Как переместить столбец с заголовком jdb
на первый столбец?
Некоторые ограничения:
- это будет применяться к нескольким файлам, и столбец
jdb
не всегда будет отображаться в одной и той же позиции - в идеале порядок оставшихся столбцов не должен меняться
jdb
всегда будет первым столбцом в конце.
Спасибо!
ОБНОВЛЕНИЕ
это 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 = (colNr=1 ? $(f["jdb"]): (colNr <= $(f["jdb"] ?
$(f[colName] -1) : $(f[colName]))))
printf "%s%s", colVal, (colNr<numCols ? OFS : ORS)
}
}
, но это не дает мне выхода ... Что я (думаю, я) сделал:
присваивать каждому значению заголовка столбца число
итерацию в диапазоне
2.1, если итератор = 0 -> печать столбца jdb
2.2 если итератор <= номер столбца jdb -> вывести номер столбца iterator - 1
2.3 если итератор> номер столбца jdb -> вывести номер столбца iterator
(это продолжение вопроса, который я поставил в /9360406/izvlechenie-stolbtsov-iz-faila-razdelennogo-tabulyatsiei)
КОНЕЦ РЕЗУЛЬТАТА
В итоге я использовал решение @Ed Morton:
$ cat move_to_first.awk
BEGIN { FS=OFS="\t" }
NR==1 {
cols[++numCols] = tgt
for (fldNr=1; fldNr<=NF; fldNr++) {
f[$fldNr] = fldNr
if ($fldNr != tgt) {
cols[++numCols] = $fldNr
}
}
}
{
for (colNr=1; colNr<=numCols; colNr++) {
colName = cols[colNr]
printf "%s%s", $(f[colName]), (colNr<numCols ? OFS : ORS)
}
}
Для любопытства, чтобы переместить столбец в последнюю позицию, приведенный выше код просто нуждается в следующей модификации:
$ cat move_to_last.awk
BEGIN {
FS=OFS="\t"
}
NR==1 {
for (fldNr=1; fldNr<=NF; fldNr++) {
f[$fldNr] = fldNr
if ($fldNr != target) {
cols[++numCols] = $fldNr
}
}
cols[++numCols] = target
}
{
for (colNr=1; colNr<=numCols; colNr++) {
colName = cols[colNr]
printf "%s%s", $(f[colName]), (colNr<numCols ? OFS : ORS)
}
}