Jak wybrać pierwszą kolumnę z ciągu rozdzielanego tabulatorami?
# echo "LOAD_SETTLED LOAD_INIT 2011-01-13 03:50:01" | awk -F'\t' '{print $1}'
Powyższe zwróci całą linię, a nie tylko „LOAD_SETTLED”, zgodnie z oczekiwaniami.
Aktualizacja:
Muszę zmienić trzecią kolumnę w wartościach rozdzielonych tabulatorami. Poniższe nie działa.
echo $line | awk 'BEGIN { -v var="$mycol_new" FS = "[ \t]+" } ; { print $1 $2 var $4 $5 $6 $7 $8 $9 }' >> /pdump/temp.txt
Działa to jednak zgodnie z oczekiwaniami, jeśli separatorem jest przecinek zamiast tabulatora.
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
wydrukować wartości rozdzielane tabulatorami z pierwszych trzech kolumn.awk 'BEGIN {OFS="\t"}; {print $1,$2,$3}'
-v
dla GNU i BSD awk do ustawiania zmiennych. UżywanieBEGIN {FS="\t"}
w programie wbudowanym jest brzydkie , a każdy wkład open source, który próbujesz w ten sposób wnieść, prawdopodobnie spotka się z sprzeciwem. Rób to tylko wtedy, gdy piszesz plik programu . Odradza się również używanie-F
zamiast,-v FS=
ponieważ ten ostatni wyjaśnia, że tylkoFS
jest ustawiany, a nieOFS
. Zamieszanie w tym ostatnim punkcie spowodowało przede wszystkim ten post. Dlatego ważny jest „dobry styl”.OFS
zmiennej.Odpowiedzi:
Musisz ustawić
OFS
zmienną (separator pól wyjściowych) na kartę:echo "$line" | awk -v var="$mycol_new" -F $'\t' 'BEGIN {OFS = FS} {$3 = var; print}'
(upewnij się, że cytujesz
$line
zmienną w instrukcji echo)źródło
$
w$'\t'
nie jest potrzebne. Wiki Grega jest lepsza: „Spośród nich$'...'
jest najbardziej powszechna i zachowuje się jak pojedyncze cudzysłowy, z wyjątkiem tego, że kombinacje ze znakami ucieczki odwrotnym ukośnikiem są interpretowane zgodnie ze standardem ANSI C”.$'\t'
nie jest to konieczne. awk rozumie, że ciąg"\t"
jest znakiem tabulacjiawk -F $'\t' 'BEGIN {OFS = FS} …'
. Tak powinno byćawk -v FS='\t' -v OFS='\t' '…'
. Może się to wydawać pedantyczne, ale brak konsekwencji zwiększa szanse, że późniejszy współpracownik wprowadzi błąd, ponieważ źle zrozumie Twój kod.Upewnij się, że to naprawdę tabulatura! W bashu możesz wstawić kartę za pomocąC-v TAB
$ echo "LOAD_SETTLED LOAD_INIT 2011-01-13 03:50:01" | awk -F$'\t' '{print $1}' LOAD_SETTLED
źródło
Możesz ustawić separator pól:
... | awk 'BEGIN {FS="\t"}; {print $1}'
Doskonała lektura:
https://docs.freebsd.org/info/gawk/gawk.info.Field_Separators.html
źródło
Używam zmiennych
FS
iOFS
do manipulowania plikami stref BIND, które są rozdzielane tabulatorami. Oto jeden z moich skryptów https://gist.github.com/RichardBronosky/abe1652c2d5c78c35b92ad02bdf0d0af#file-dns_update-sh-L36-L39Jej mięso to:
awk -v FS='\t' -v OFS='\t' \ -v record_type=$record_type \ -v hostname=$hostname \ -v ip_address=$ip_address ' $1==hostname && $3==record_type {$4=ip_address} {print} ' $zone_file > $temp
Jest to czysty i łatwy do odczytania sposób, aby to zrobić.
źródło
echo "LOAD_SETTLED LOAD_INIT 2011-01-13 03:50:01" | awk -v var="test" 'BEGIN { FS = "[ \t]+" } ; { print $1 "\t" var "\t" $3 }'
źródło
Czy to nie powinno działać?
echo "LOAD_SETTLED LOAD_INIT 2011-01-13 03:50:01" | awk '{print $1}'
źródło