Столбец печати AWK зависит от заголовка с запятой-разделителем

Я пытаюсь напечатать столбцы с указанными именами столбцов. Но я обнаружил, что когда разделителем является ",", мой код не может разделить строку. Он напечатает всю строку. Не могли бы вы помочь мне разобраться в этом вопросе?

Мой входной файл имеет 3 столбца, разделенных запятой:

AWS_path,path
aws_test1,11111
aws_test2,22222

Мой код:

input=$1
awk -F "," 'NR==1 {
    for (i=1; i<=NF; i++) {
        f[$i] = i
        print $i
        print f[$i]
    }
} NR>1 { print $(f["AWS_path"]), $(f["path"])}' $input

Результат показывает AWS_path и путь. Я думаю, что это должно быть:

aws_test1 11111
aws_test2 22222

Но на самом деле он выводит, как показано ниже, его столбец пути включает всю строку, а не только второй столбец.

aws_test1,11111 aws_test1,11111
aws_test2,22222 aws_test2,22222

Я пробовал много способов. Но я не могу это исправить. Не могли бы вы мне помочь?


person ywan    schedule 20.12.2019    source источник
comment
ваш код работает для меня   -  person kvantour    schedule 20.12.2019
comment
Да, это работает. Я рекомендую использовать читаемый пример, например: foo_aws_path,foo_variant_type,foo_path   -  person hek2mgl    schedule 20.12.2019
comment
@kvantour, @hek2mgl Я обновил свой пример, чтобы сделать его более читабельным. Не могли бы вы попробовать еще раз?   -  person ywan    schedule 20.12.2019
comment
Если вы работаете в Windows, ваш файл данных может быть UTF-16, где ваш код ... в основном любой 8-битный набор на основе ascii, UTF-8, ISO-Latin-1, ASCII, все то же самое. Readin покажет заголовок UTF-16 с нулями, но это не будет соответствовать кодировке в вашем файле. Попробуйте передать свой вывод через cat -A или полноценный шестнадцатеричный дампер, чтобы увидеть, так ли это. Или просто file input.txt и посмотрите, что там написано о кодовой странице.   -  person jthill    schedule 21.12.2019


Ответы (1)


В вашем файле есть окончание строки Windows, т.е. \r\n, а не просто \n, поэтому в вашем коде есть "path", но в файле есть path\r и нет совпадений. Используйте dos2unix file или аналогичный:

$ awk -f program.awk file    # testing with \r\n endings
AWS_path
1
path
2
aws_test1 aws_test1,11111
aws_test2 aws_test2,22222
$ dos2unix file              # convert to \n
$ awk -f program.awk file    # testing with \n endings
AWS_path
1
path
2
aws_test1 11111
aws_test2 22222
person James Brown    schedule 20.12.2019
comment
Спасибо за вашу помощь. Я думаю, что проблема должна быть в \r\n. Потому что когда я создаю пример в Linux, код работает. Но когда я попробовал dos2unix. Он по-прежнему возвращает всю строку. плач... - person ywan; 20.12.2019
comment
Очень хороший улов - person kvantour; 21.12.2019
comment
Это странно . - person James Brown; 21.12.2019