18

次のコマンドを検討してください。

$ gawk -F"\t" "BEGIN{OFS=\"\t\"}{$2=$3=\"\"; print $0}" Input.tsv

を設定$2 = $3 = ""すると、意図した効果は、次のように書くのと同じ効果を得ることです。

print $1,$4,$5...$NF

ただし、実際には 2 つの空のフィールドが表示され、余分なフィールド区切り文字が印刷されます。

実際に削除することは可能$2です$3か?

注: これが Linux の であった場合bash、上記の正しいステートメントは次のようになりますが、Windows は で単一引用符を適切に処理しませんcmd.exe

$ gawk -F'\t' 'BEGIN{OFS="\t"}{$2=$3=""; print $0}' Input.tsv
4

10 に答える 10

7

途中でフィールドを削除することはできませんが、デクリメントすることで最後のフィールドを削除できますNF

したがって、後のフィールドをすべて下にシフトして上書き$2し、$32NFずつ減らすと、最後の 2 つのフィールドが消去されます。

$ echo 1 2 3 4 5 6 7 | awk '{for(i=2; i<NF-1; ++i) $i=$(i+2); NF-=2; print $0}'
1 4 5 6 7
于 2012-06-26T23:33:50.913 に答える
5

列を削除するだけの場合は、次を使用できますcut

$ cut -f 1,4- file.txt

エミュレートするにはcut:

$ awk -F "\t" '{ for (i=1; i<=NF; i++) if (i != 2 && i != 3) { if (i == NF) printf $i"\n"; else printf $i"\t" } }' file.txt

同様に:

$ awk -F "\t" '{ delim =""; for (i=1; i<=NF; i++) if (i != 2 && i != 3) { printf delim $i; delim = "\t"; } printf "\n" }' file.txt

HTH

于 2012-05-21T23:06:55.370 に答える
1

Suicidal Steve による回答に加えて、もう 1 つの解決策を提案したいと思いますが、sed代わりにawk.

cutSteve が提案したように、 の使用法よりも複雑に思えます。sed -iしかし、その場で編集できるため、より良い解決策でした。

$ sed -i 's/\(.*,\).*,.*,\(.*\)/\1\2/' FILENAME
于 2013-09-05T22:46:25.170 に答える
1

1つの方法は、あなたのようにフィールドを削除し、次のように余分なスペースを削除することですgsub:

$ awk 'BEGIN { FS = "\t" } { $2 = $3 = ""; gsub( /\s+/, "\t" ); print }' input-file
于 2012-06-27T20:48:27.740 に答える
-1
echo one two three four five six|awk '{
print $0
is3=$3
$3=""
print $0
print is3
}'

1 2 3 4 5 6

1 2 4 5 6

于 2016-12-31T04:12:31.260 に答える