awkのタブ区切り値


90

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

4
awk'BEGIN {FS = "[\ t] +"}; {print $ 1} '#これが私が探していたものです。私のグーグル検索は正しいですか?:)
shantanuo 2011年

3
このコメントのおかげで、私は次のことを発見しましたawk 'BEGIN {FS="\t"}; {print $1,FS,$2,FS,$3}' myFile.txt。最初の3列のタブ区切り値を出力すること。
中華鍋2013年

6
または単にawk 'BEGIN {OFS="\t"}; {print $1,$2,$3}'
Josiah Yoder 2015

3
GNUとBSDの両方のawkが-v変数の設定をサポートしています。インラインプログラムBEGIN {FS="\t"}内で使用するのは醜く、そのようにしようとするオープンソースの貢献は反対される可能性があります。プログラムファイルを作成している場合にのみ、これを実行してください。また、の代わりに使用することはお勧めしません。後者は、設定されているだけで、設定されていないことを明確にするためです。その最後の点についての混乱は、そもそもこの投稿を引き起こしたものです。そのため、「良いスタイル」が重要です。-F-v FS=FSOFS
Bruno Bronosky 2018

1
@Wokが示したことを誰もやるべきではありません。出力に[入力]フィールドセパレータを列挙しません。OFS変数を介して出力フィールド区切り文字を指定します。
Bruno Bronosky 2018

回答:


141

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

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

$lineechoステートメントで変数を引用符で囲んでください)


6
$ '\ t'の$の目的は何ですか?
Amr Mostafa 2013年

10
Advanced Bash Scripting Guideからの私自身の質問への回答:$ '...'引用符で囲まれた文字列拡張構造は、エスケープされた8進数または16進数の値を使用するメカニズムです...たとえば、quote = $ '\ 042'。
Amr Mostafa 2013年

5
@AmrMostafa、ガイドはあなたがいないことを考えるのは誤解を招く説明先頭の1を持っていることは残念$では$'\t'必要ありません。Gregのwikiの方が優れています。「これらのうち$'...'、最も一般的であり、バックスラッシュでエスケープされた組み合わせがANSI C標準で指定されているように展開されることを除いて、一重引用符と同じように機能します」。
Cristian Ciupitu 2014

9
後から考えると、$'\t'は必要ありません。awkは、文字列"\t"がタブ文字であることを理解しています
glenn jackman 2015年

5
オープンソースの貢献者、お願いしますawk -F $'\t' 'BEGIN {OFS = FS} …'。のようなものを提出しないでください。それはあるはずですawk -v FS='\t' -v OFS='\t' '…'。衒学的に見えるかもしれませんが、一貫性がないと、後の寄稿者がコードを誤解しているためにバグが発生する可能性が高くなります。
Bruno Bronosky 2018

21

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

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


9

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
echo "LOAD_SETTLED    LOAD_INIT       2011-01-13 03:50:01" | awk -v var="test" 'BEGIN { FS = "[ \t]+" } ; { print $1 "\t" var "\t" $3 }'

0

これは機能しないはずですか?

echo "LOAD_SETTLED    LOAD_INIT       2011-01-13 03:50:01" | awk '{print $1}'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.