75

各行に多くの行があるファイルがあり、空白で区切られた多くの列(フィールド)があります ""各行の列数が異なります最初の2つの列を削除するにはどうすればよいですか?

4

9 に答える 9

157

あなたはそれを行うことができますcut

cut -d " " -f 3- input_filename > output_filename

説明:

  • cut: カット コマンドを呼び出します
  • -d " ": 区切り文字として単一のスペースを使用します (cutデフォルトでは TAB を使用します)
  • -f: 保持するフィールドを指定します
  • 3-: フィールド 3 で始まるすべてのフィールド
  • input_filename: このファイルを入力として使用します
  • > output_filename: 出力をこのファイルに書き込みます。

または、次の方法で実行できますawk

awk '{$1=""; $2=""; sub("  ", " "); print}' input_filename > output_filename

説明:

  • awk: awk コマンドを呼び出す
  • $1=""; $2="";: フィールド 1 と 2 を空の文字列に設定します
  • sub(...);: フィールド 1 と 2 は引き続き " " で区切られるため、出力フィールドをクリーンアップします。
  • print: 変更された行を出力します
  • input_filename > output_filename: 同上。
于 2012-11-19T00:48:21.497 に答える
29

比較的理解しやすい Awk を使用した方法の 1 つを次に示します。

awk '{print substr($0, index($0, $3))}'

これはパターンのない単純な awk コマンドであるため、内部のアクション{}は入力行ごとに実行されます。

アクションは、3 番目のフィールドの位置から始まる部分文字列を単純に出力することです。

  • $0: 入力行全体
  • $3: 第 3 フィールド
  • index(in, find)find:文字列内の位置を返しますin
  • substr(string, start): index から始まる部分文字列を返しますstart

コンマなどの別の区切り文字を使用する場合は、 -F オプションで指定できます。

awk -F"," '{print substr($0, index($0, $3))}'

でアクションの前にパターンを指定することにより、入力行のサブセットでこれを操作することもできます{}。パターンに一致する行だけがアクションを実行します。

awk 'pattern{print substr($0, index($0, $3))}'

pattern は次のようなものです。

  • /abcdef/: 正規表現を使用し、デフォルトで $0 で動作します。
  • $1 ~ /abcdef/: 特定のフィールドを操作します。
  • $1 == blabla: 文字列比較を使用
  • NR > 1: レコード/行番号を使用
  • NF > 0: フィールド/列番号を使用
于 2013-02-05T19:18:29.030 に答える
12

質問を投稿していただきありがとうございます。また、私を助けたスクリプトを追加したいと思います。

awk '{ $1=""; print $0 }' file
于 2014-07-07T01:13:19.633 に答える
6

シェルだけでそれを行うのはかなり簡単です

while read A B C; do
echo "$C"
done < oldfile >newfile
于 2014-07-07T02:09:52.167 に答える
4

パール:

perl -lane 'print join(' ',@F[2..$#F])' File

awk:

awk '{$1=$2=""}1' File
于 2014-12-10T09:17:46.497 に答える
1

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

sed -r 's/^([^ ]+ ){2}//' file

または、1つ以上の空白で区切られた列の場合:

sed -r 's/^(\S+\s+){2}//' file
于 2012-11-19T07:14:05.560 に答える