2

年を抽出して別の新しい列に出力し、新しい列を整列させようとしています。

入力ファイルは次のとおりです。

0000000124  462910   8.8  Star Wars: Episode V - The Empire Strikes Back (1980) 
0000000124  698356   8.8  The Lord of the Rings: The Fellowship of the Ring (2001)
0000000233  393855   8.8  One Flew Over the Cuckoo's Nest (1975)
0000000124  733447   8.7  Inception (2010)
0000000233  411397   8.7  Goodfellas (1990)
0000000123  519051   8.7  Star Wars (1977)
0000000124  146841   8.7  Shichinin no samurai (1954)
0000000123  618195   8.7  Forrest Gump (1994)
0000000123  680520   8.7  The Matrix (1999)
0000000123  604519   8.7  The Lord of the Rings: The Two Towers (2002)
0000000233  309137   8.7  Cidade de Deus (2002)
0000000232  548307   8.6  Se7en (1995)
0000000232  459707   8.6  The Silence of the Lambs (1991)

このように別の列で年を取得するにはどうすればよいですか?

0000000124  462910   8.8  Star Wars: Episode V - The Empire Strikes Back                  1980
0000000124  698356   8.8  The Lord of the Rings: The Fellowship of the Ring               2001
0000000233  393855   8.8  One Flew Over the Cuckoo's Nest                                 1975
0000000124  733447   8.7  Inception                                                       2010
0000000233  411397   8.7  Goodfellas                                                      1990
0000000123  519051   8.7  Star Wars                                                       1977
0000000124  146841   8.7  Shichinin no samurai                                            1954
0000000123  618195   8.7  Forrest Gump                                                    1994
0000000123  680520   8.7  The Matrix                                                      1999
0000000123  604519   8.7  The Lord of the Rings: The Two Towers                           2002
0000000233  309137   8.7  Cidade de Deus                                                  2002
0000000232  548307   8.6  Se7en                                                           1995
0000000232  459707   8.6  The Silence of the Lambs                                        1991
4

4 に答える 4

4

awkこれは、サンプル データで動作する を使用したソリューションです。

$ awk -F\( '{printf("%-77s %d\n", $1, $2)}' movies.txt

書式を好みに合わせて調整します (ここでは、年は78列目に配置されています。書式指定子で変更できます。たとえば、%-99s100 列目から開始する場合に使用します。

于 2013-07-26T08:43:17.533 に答える
4

これを行うための簡単なハックを次に示します。

$ awk '{gsub(/[()]/,"",$NF);$NF="{"$NF}1' file | column -s'{' -t 
0000000124 462910 8.8 Star Wars: Episode V - The Empire Strikes Back      1980
0000000124 698356 8.8 The Lord of the Rings: The Fellowship of the Ring   2001
0000000233 393855 8.8 One Flew Over the Cuckoo's Nest                     1975
0000000124 733447 8.7 Inception                                           2010
0000000233 411397 8.7 Goodfellas                                          1990
0000000123 519051 8.7 Star Wars                                           1977
0000000124 146841 8.7 Shichinin no samurai                                1954
0000000123 618195 8.7 Forrest Gump                                        1994
0000000123 680520 8.7 The Matrix                                          1999
0000000123 604519 8.7 The Lord of the Rings: The Two Towers               2002
0000000233 309137 8.7 Cidade de Deus                                      2002
0000000232 548307 8.6 Se7en                                               1995
0000000232 459707 8.6 The Silence of the Lambs                            1991

awk最後のフィールドから括弧を削除し、{文字を挿入するために使用されます。出力は、セパレーターとしてcolumn使用してテーブルを構築するためにパイプされます。{データの他の場所で発生する可能性は低いと思ったので、文字を選択します{。そうでない場合は、別の文字を選択します。

私があなたなら、映画のタイトルも引用します。

$ awk '{gsub(/[()]/,"",$NF);$NF="{"$NF;$4=q$4;$(NF-1)=$(NF-1)q}1' q='"' file | ..
0000000124 462910 8.8 "Star Wars: Episode V - The Empire Strikes Back"      1980
0000000124 698356 8.8 "The Lord of the Rings: The Fellowship of the Ring"   2001
0000000233 393855 8.8 "One Flew Over the Cuckoo's Nest"                     1975
0000000124 733447 8.7 "Inception"                                           2010
0000000233 411397 8.7 "Goodfellas"                                          1990
0000000123 519051 8.7 "Star Wars"                                           1977
0000000124 146841 8.7 "Shichinin no samurai"                                1954
0000000123 618195 8.7 "Forrest Gump"                                        1994
0000000123 680520 8.7 "The Matrix"                                          1999
0000000123 604519 8.7 "The Lord of the Rings: The Two Towers"               2002
0000000233 309137 8.7 "Cidade de Deus"                                      2002
0000000232 548307 8.6 "Se7en"                                               1995
0000000232 459707 8.6 "The Silence of the Lambs"                            1991

はるかに優れたアプローチは、python などの言語を使用することです。

文字列関数rfind()を使用してパディングを計算できます。がある場合は、次のスクリプトを使用する必要がありますpython

import os
import sys

try:
    n = int(sys.argv[2])
except IndexError:
    n = 78
try:
    if os.path.isfile(sys.argv[1]):
        with open(sys.argv[1],'r') as f:
            for line in f:
                line = line.strip()
                pad = n - line.rfind("(")
                print line[:-7],' '*pad,line[-5:-1]
    else:
        print "Please provide a file."
except IndexError:
    print "Please provide a file."

などのファイルに保存し、次のtable.pyように実行します。

$ python table.py file
0000000124  462910   8.8  Star Wars: Episode V - The Empire Strikes Back        1980
0000000124  698356   8.8  The Lord of the Rings: The Fellowship of the Ring     2001
0000000233  393855   8.8  One Flew Over the Cuckoo's Nest                       1975
0000000124  733447   8.7  Inception                                             2010
0000000233  411397   8.7  Goodfellas                                            1990
0000000123  519051   8.7  Star Wars                                             1977
0000000124  146841   8.7  Shichinin no samurai                                  1954
0000000123  618195   8.7  Forrest Gump                                          1994
0000000123  680520   8.7  The Matrix                                            1999
0000000123  604519   8.7  The Lord of the Rings: The Two Towers                 2002
0000000233  309137   8.7  Cidade de Deus                                        2002
0000000232  548307   8.6  Se7en                                                 1995
0000000232  459707   8.6  The Silence of the Lambs                              1991
0000000123  123456   9.9  The best file (of all time)                           2025

次のフィルムが追加されていることに注意してください。

0000000123  123456   9.9  The best file (of all time) (2025)

リリース列の位置を増やす必要がある場合は、次のように 2 番目の引数として値を渡します。

$ python table.py file 100 
于 2013-07-26T08:29:38.593 に答える
0

Python 2.X ソリューションは次のとおりです。

$ python --version
Python 2.7.3
$ echo "0000000124  462910   8.8  Star Wars: Episode V - The Empire Strikes Back (1980)" | python -c "import sys;s=sys.stdin.readlines()[0]; print '%s\t%s' % (s[:-7], s[-6:-2])"
0000000124  462910   8.8  Star Wars: Episode V - The Empire Strikes Back    1980

あなたの文字列が入っているtmpfile場合:

$ cat tmpfile | python -c "import sys;map(lambda i: sys.stdout.write('%s %s %s\n' % (i[:-8], ' '*(100-len(i)), i[-6:-2])), sys.stdin.readlines())"
0000000124  462910   8.8  Star Wars: Episode V - The Empire Strikes Back                      1980
0000000124  698356   8.8  The Lord of the Rings: The Fellowship of the Ring                   2001
0000000233  393855   8.8  One Flew Over the Cuckoo's Nest                                     1975
0000000124  733447   8.7  Inception                                                           2010
0000000233  411397   8.7  Goodfellas                                                          1990
0000000123  519051   8.7  Star Wars                                                           1977
0000000124  146841   8.7  Shichinin no samurai                                                1954
0000000123  618195   8.7  Forrest Gump                                                        1994
0000000123  680520   8.7  The Matrix                                                          1999
0000000123  604519   8.7  The Lord of the Rings: The Two Towers                               2002
0000000233  309137   8.7  Cidade de Deus                                                      2002
0000000232  548307   8.6  Se7en                                                               1995
0000000232  459707   8.6  The Silence of the Lambs                                            1991
于 2013-07-26T08:29:45.253 に答える