3列のファイルがあります。3列目を削除したい(インプレース編集)。どうすればawkまたはsedでこれを行うことができますか?
123 abc 22.3
453 abg 56.7
1236 hjg 2.3
必要な出力
123 abc
453 abg
1236 hjg
この短いことを試してください:
awk '!($3="")' file
\s/\S
インプレース編集、、およびgensub()
削除のためのGNUawkを使用
1)最初のフィールド:
awk -i inplace '{sub(/^\S+\s*/,"")}1' file
また
awk -i inplace '{$0=gensub(/^\S+\s*/,"",1)}1' file
2)LASTフィールド:
awk -i inplace '{sub(/\s*\S+$/,"")}1' file
また
awk -i inplace '{$0=gensub(/\s*\S+$/,"",1)}1' file
3)N = 3の場合のN番目のフィールド:
awk -i inplace '{$0=gensub(/\s*\S+/,"",3)}1' file
GNU awkがない場合、中間フィールドを削除するにはmatch()
+substr()
コンボまたは複数のs+varsが必要です。最初の3列を除くすべてを印刷するsub()
も参照してください。
これはあなたのために働くかもしれません(GNU sed):
sed -i -r 's/\S+//3' file
3番目のフィールドの前の空白を削除する場合:
sed -i -r 's/(\s+)?\S+//3' file
あなたは簡単に行くことができるようです
awk '{print $1 " " $2}' file
これにより、入力ファイルの各行の最初の2つのフィールドが、スペースで区切られて印刷されます。
カットを使ってみてください...その速くて簡単
最初にスペースを繰り返しましたが、それが必要な場合は、列の間の単一のスペースにそれらを絞ることができますtr -s ' '
各列の間にすでに1つの区切り文字しかない場合は、cut -d ' ' -f-2
フィールド(列)<=2を印刷するために使用できます。
たとえば、データがファイルinput.txtにある場合は、次のいずれかを実行できます。
cat input.txt | tr -s ' ' | cut -d ' ' -f-2
または、3番目の列を削除してこの問題についてより適切な理由があれば、次のように書くことができます。
cat input.txt | tr -s ' ' | cut -d ' ' --complement -f3
カットは非常に強力です。列に加えて、バイトまたは文字の範囲を抽出することもできます
リスト範囲を指定する方法の構文に関するマニュアルページからの抜粋
Each LIST is made up of one range, or many ranges separated by commas.
Selected input is written in the same order that it is read, and is
written exactly once. Each range is one of:
N N'th byte, character or field, counted from 1
N- from N'th byte, character or field, to end of line
N-M from N'th to M'th (included) byte, character or field
-M from first to M'th (included) byte, character or field
したがって、特定の列1と2が必要だと言った可能性もあります...
cat input.txt | tr -s ' ' | cut -d ' ' -f1,2
これを試して :
awk '$3="";1' file.txt > new_file && mv new_file file.txt
また
awk '{$3="";print}' file.txt > new_file && mv new_file file.txt
あなたがPerlソリューションにオープンであるなら...
perl -ane 'print "$F[0] $F[1]\n"' file
次のコマンドラインオプションが使用されます。
-n
入力ファイルのすべての行をループし、すべての行を自動的に印刷しない
-a
自動分割モード–入力行を@F配列に分割します。デフォルトは空白で分割します
-e
次のPerlコードを実行します