この種のファイルがありますが、最後の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
-s
paste
TAB=\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