Как я могу выбрать столбцы на основе файла управления с недопустимыми номерами столбцов?

Попробуйте изменить это: в то время как Гуманы: флаг: A: B; Сделайте

к этому: пока титулки: A: B: flag; делать

0
18.09.2014, 23:56
3 ответа

Другой ответ, немного проще остальных:

#!/bin/bash
fields=$(sed -r -e 's/-1/ /g' -e 's/,/ FS /g' \
  -e 's/([0-9]+)/\$\1/g' control_file.txt)
awk -F, "{print ${fields}}" $1

Первая команда преобразует control_file. txt в подходящую awk команду:

$1 FS $3 FS $5 FS FS $8 FS FS $4

для запуска:

$ ./script.sh input.csv
col1,col3,col5,,col8,,col4
1,3,5,,8,,4
9,11,13,,16,,12

На другом примере:

$ ./script.sh sample.csv
BP ID,CurrentMonetary balance ,Provider contract id,,End Date,,charge Plan names 
1100001538,251,00000000000000000141,,18-Oct-12,,[B2] R2 LTE CHARGE PLAN 
1100003404,45.22,00000000000000009349,,23-Nov-13,,B0.3 ECS_CHARGE_PLAN DROP1 V3
1
28.01.2020, 02:52

файл awk

BEGIN { sp="-1" ;  FS="," ; }
FILENAME == "control.txt" { for (i=1;i<=NF;i++) col[i]=$i ;  next ;}
FILENAME != "control.txt" {
    comma="" ;
    for (i=1;i<NF;i++) {
            c=col[i] ;
            if (col[i]!=-1) printf "%s%s",comma,$c ;
            else printf "%s%s",comma,sp ;
            comma="," ;
    }
    printf "\n" ;
    sp="" ;
    }

запуск

 awk -f a.awk control.txt  sample.txt
 col1,col3,col5,-1,col8,-1,col4
 1,3,5,,8,,4
 9,11,13,,16,,12

в основном, первая строка в control.txt выводит на печать какой столбец.

0
28.01.2020, 02:52
echo '1,2,3,4,5,6,7,8' |
sed 's/[^,]*//7;s///6;s///2;s/,,/,/
    s/\([^,]*\),\([^,]*\),,.*,\(.*\)/\2,,\3,,\1/'

Это удаляет содержимое полей 7,6,2. Затем он удаляет первое пустое поле. Затем он меняет местами последние три непустых поля, например 2,, 3,, 1.

ВЫВОД

1,3,5,,8,,4

И запустите образец данных:

BP ID,CurrentMonetary balance ,Provider contract id,,End Date,,charge Plan names 
1100001538,251,00000000000000000141,,18-Oct-12,,[B2] R2 LTE CHARGE PLAN 
1100003404,45.22,00000000000000009349,,23-Nov-13,,B0.3 ECS_CHARGE_PLAN DROP1 V3

Опять же, если вы можете проверить свой разделитель, вы можете просто использовать оболочку:

set -f; IFS=,
set -- $(cat file; echo "$IFS")
while [ $# -gt 8 ]
do printf %s\\n "$1,$3,$5,,$8,,$4"
   shift "$(($#>7?8:$#))"
done

С параметром оболочки поля могут содержать что угодно, кроме разделителя. Пока у вас есть разделитель, отличный от <пробел> <новая строка> , пустые поля будут сохраняться. Любые содержащиеся в них символы - включая любой из этих трех пробельных символов - сохраняются. Здесь я использую запятую. Вам нужно только достаточно памяти, чтобы поместиться в файл.

0
28.01.2020, 02:52

Теги

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