web-dev-qa-db-ja.com

awkのタブ区切り値

TABで区切られた文字列から最初の列を選択するにはどうすればよいですか?

# echo "LOAD_SETTLED    LOAD_INIT       2011-01-13 03:50:01" | awk -F'\t' '{print $1}'

上記は、期待どおりに「LOAD_SETTLED」だけでなく、行全体を返します。

更新:

タブ区切り値の3列目を変更する必要があります。以下は機能しません。

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
74
shantanuo

OFS変数(出力フィールド区切り記号)をタブに設定する必要があります。

echo "$line" | 
awk -v var="$mycol_new" -F $'\t' 'BEGIN {OFS = FS} {$3 = var; print}'

(echoステートメントで$line変数を引用してください)

124
glenn jackman

それらが本当にタブであることを確認してください! bashでは、次を使用してタブを挿入できます C-v TAB

$ echo "LOAD_SETTLED    LOAD_INIT       2011-01-13 03:50:01" | awk -F$'\t' '{print $1}'
LOAD_SETTLED
19

フィールドセパレーターを設定できます。

... | awk 'BEGIN {FS="\t"}; {print $1}'

優れた読書:

https://docs.freebsd.org/info/gawk/gawk.info.Field_Separators.html

16
John Kloian
echo "LOAD_SETTLED    LOAD_INIT       2011-01-13 03:50:01" | awk -v var="test" 'BEGIN { FS = "[ \t]+" } ; { print $1 "\t" var "\t" $3 }'
5
shantanuo

FSおよびOFS変数を使用して、タブ区切りのBINDゾーンファイルを操作します。ここに私のスクリプトの1つ https://Gist.github.com/RichardBronosky/abe1652c2d5c78c35b92ad02bdf0d0af#file-dns_update-sh-L36-L39

それの肉は次のとおりです。

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

これは、クリーンで読みやすい方法です。

5
Bruno Bronosky

これは機能しませんか?

echo "LOAD_SETTLED    LOAD_INIT       2011-01-13 03:50:01" | awk '{print $1}'
0
asadz