50

3列のファイルがあります。3列目を削除したい(インプレース編集)。どうすればawkまたはsedでこれを行うことができますか?

123   abc  22.3
453   abg  56.7
1236  hjg  2.3

必要な出力

123  abc
453  abg
1236 hjg 
4

7 に答える 7

67

この短いことを試してください:

awk '!($3="")' file
于 2013-03-12T13:00:10.407 に答える
41

\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()も参照してください。

于 2016-07-01T12:24:32.390 に答える
26

これはあなたのために働くかもしれません(GNU sed):

sed -i -r 's/\S+//3' file

3番目のフィールドの前の空白を削除する場合:

sed -i -r 's/(\s+)?\S+//3' file
于 2013-03-12T12:55:22.090 に答える
18

あなたは簡単に行くことができるようです

awk '{print $1 " " $2}' file

これにより、入力ファイルの各行の最初の2つのフィールドが、スペースで区切られて印刷されます。

于 2013-03-12T12:51:00.187 に答える
11

カットを使ってみてください...その速くて簡単

最初にスペースを繰り返しましたが、それが必要な場合は、列の間の単一のスペースにそれらを絞ることができます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
于 2017-08-31T14:55:27.963 に答える
8

これを試して :

awk '$3="";1' file.txt > new_file && mv new_file file.txt

また

awk '{$3="";print}' file.txt > new_file && mv new_file file.txt
于 2013-03-12T12:56:02.447 に答える
0

あなたがPerlソリューションにオープンであるなら...

perl -ane 'print "$F[0] $F[1]\n"' file

次のコマンドラインオプションが使用されます。

  • -n入力ファイルのすべての行をループし、すべての行を自動的に印刷しない

  • -a自動分割モード–入力行を@F配列に分割します。デフォルトは空白で分割します

  • -e次のPerlコードを実行します

于 2020-09-11T19:48:31.747 に答える