行を2つの列と2つの列に印刷

行を2つの列と2つの列に印刷

この種のファイルがありますが、最後の2つの列のみを取得し、1行に2つずつ印刷する方法を探しています。誰かが私にアイデアを与えることができますか?参加していただきありがとうございます:

  1     0.00     435.9     6.04
  2     6.04     691.7    27.61
  3    33.65     964.5    10.03
  4    43.68    1932.5

出力

435.9 6.04     691.7 27.61     964.5 10.03    1932.5

答え1

このように?

awk '{printf ("%s %s\t", $3, $4)}' file

あるいは、このように欠落しているフィールドを処理することもできます。

awk '{field3=$3; field4=$4} $3==""{field3="\t"} $4==""{field4="\t"} {printf ("%s %s\t", field3, field4)}' file

答え2

パイプを使用して3番目と4番目のフィールドをスペースで区切って印刷し、各ペアをデフォルトの区切り文字awk-pasteで区切ってすべての行に表示するオプションを渡します。paste-spasteTAB=\t

$ awk '{print $3, $4}' file | paste -s -

に滞在したい場合は、awk次のようにすることも可能です。

$ awk '
    BEGIN { s[1] = "\t"; ORS = "" }
    { print s[(NR>1)] $3, $4 }
    END { print RS }
' file

いくつかのことができますが、cut-pasteその前に小さな編集をする必要があります。つまり、すべてのスペースをスペースに変換し、複数のスペースを圧縮し、先行スペースがある場合は削除する必要があります。これはcut、区切り文字として単一の文字が必要で、カットが先行区切り文字を無視しないためです。

$ < file sed -Ee 's/\s+/ /g;s/^ //' |
    cut -d' ' -f3,4 | paste -s -

答え3

Python

#!/usr/bin/python
import re
m=re.compile(r'\s{1,}')
t=[]
k=open('file.txt','r')
for i in k:
    j=re.sub(m," ",i)
    try:
        o=j.strip().split(' ')
        if (len(o) == 4):
            y="{0} {1}".format(o[2],o[3])
        elif (len(o) == 3):
            y="{0}".format(o[2])
        else:
            print "Number of columns is less than 3"
        t.append(y)

    except:
        pass

print "\t".join(t)

出力

 python test.py 
435.9 6.04  691.7 27.61 964.5 10.03 1932.5
praveen@praveen:~

$

awkコマンド

awk '{print $3,$4}' filename| perl -pne "s/\n/\t/g"

435.9 6.04 691.7 27.61 964.5 10.03 1932.5

関連情報