Изменение FS в AWK для нескольких файлов

Я пытаюсь прочитать несколько файлов в AWK-скрипте, но когда я переключаюсь между файлами, полевой разделитель (FS) также должен измениться. На данный момент я получил:

FILENAME=="A.txt"{ FS=";" //DoSomething } FILENAME=="B.txt"{ FS=" - " //DoSomething } 

Но, как вы знаете, FS не будет правильно настроен для первой строки файла. Как я могу это решить?

Вы можете указать разделители полей в командной строке:

 awk -f a.awk FS=";" A.txt FS=" - " B.txt 

Таким образом, разделитель полей будет изменяться для каждого файла. С http://www.delorie.com/gnu/docs/gawk/gawk_82.html :

Любая переменная awk может быть задана путем включения назначения переменных из аргументов в командной строке при вызове awk

а также

С его помощью переменная устанавливается либо в начале прогона awk, либо между входными файлами.

Вы можете сделать это, как предлагает @HakonHaegland, установив FS между именами файлов в списке arg, если вы перечисляете файлы по отдельности. Это типичный способ сделать это.

Кроме того, если вы не можете этого сделать (например, потому что вам нужно использовать * или аналогичный для списка файлов), вы можете использовать BEGINFILE, если используете GNU awk, но в противном случае вы можете сделать это так, как вы уже добавили присвоение $ 0 себе после изменения FS, чтобы заставить awk повторно разбить запись. например:

 $ cat file abc def $ awk '{print NF, $1}' file 1 abc 3 d $ awk '{FS="-"; $0=$0; print NF, $1}' file 3 a 1 def 

Если вы собираетесь делать это, лучше всего сделать это только один раз в начале каждого файла (когда FNR==1 ).