Как выбрать первый столбец из строки, разделенной табуляцией?
# echo "LOAD_SETTLED LOAD_INIT 2011-01-13 03:50:01" | awk -F'\t' '{print $1}'
Приведенное выше вернет всю строку, а не только "LOAD_SETTLED", как ожидалось.
Обновить:
Мне нужно изменить третий столбец в значениях, разделенных вкладкой. Следующее не работает.
echo $line | awk 'BEGIN { -v var="$mycol_new" FS = "[ \t]+" } ; { print $1 $2 var $4 $5 $6 $7 $8 $9 }' >> /pdump/temp.txt
Однако это работает должным образом, если разделителем является запятая вместо табуляции.
echo $line | awk -v var="$mycol_new" -F'\t' '{print $1 "," $2 "," var "," $4 "," $5 "," $6 "," $7 "," $8 "," $9 "}' >> /pdump/temp.txt
awk 'BEGIN {FS="\t"}; {print $1,FS,$2,FS,$3}' myFile.txt
печатать значения, разделенные табуляцией, первых трех столбцов.awk 'BEGIN {OFS="\t"}; {print $1,$2,$3}'
-v
установку переменных. Некрасиво использоватьBEGIN {FS="\t"}
внутри встроенной программы , и против любого вклада с открытым исходным кодом, который вы пытаетесь сделать так, скорее всего, будут возражать. Делайте это только в том случае, если вы пишете программный файл . Кроме того, не рекомендуется использовать-F
вместо,-v FS=
потому что последнее дает понять, что толькоFS
устанавливается, а не нетOFS
. Путаница по поводу последнего пункта - вот что в первую очередь вызвало этот пост. Вот почему так важен «хороший стиль».OFS
переменную.Ответы:
Вам нужно установить
OFS
переменную (разделитель полей вывода) как вкладку:(убедитесь, что вы указали
$line
переменную в операторе echo)источник
$
в$'\t'
не требуются. Вики Грега лучше: «Из них$'...'
это наиболее распространено и действует так же, как одинарные кавычки, за исключением того, что комбинации с обратным слэшем расширяются в соответствии со стандартом ANSI C».$'\t'
этом нет необходимости. awk понимает, что строка"\t"
является символом табуляцииawk -F $'\t' 'BEGIN {OFS = FS} …'
. Так и должно бытьawk -v FS='\t' -v OFS='\t' '…'
. Это может показаться педантичным, но непоследовательность увеличивает вероятность того, что более поздний участник внесет ошибку из-за неправильного понимания вашего кода.Убедитесь, что это действительно вкладки! В bash вы можете вставить вкладку, используяC-v TAB
источник
Вы можете установить разделитель полей:
Отличное чтение:
https://docs.freebsd.org/info/gawk/gawk.info.Field_Separators.html
источник
Использование:
awk -v FS='\t' -v OFS='\t' ...
Пример из одного из моих скриптов .
Я использую
FS
иOFS
переменные для управления файлами зоны BIND, которые табуляцией:Это простой и понятный способ сделать это.
источник
источник
Это не должно работать?
источник