2016-03-28 10 views
1

次のように私はSAMPLE.TXTファイルを持っている:示されているようBASHでAWKとfprintを使用してテキストファイルを解析するにはどうすればよいですか?

Name   City ST Zip CTY 
John Smith BrooklynNY10050USA 
Paul DavidsonQueens NY10040USA 
Michael SmithNY  NY10030USA 
George HermanBronx NY10020USA 

入力の画像(場合には、アップロードが正常に表示されていない場合) Input

所望の出力を別々の列にあります以下の下:

Desired Output

私はこれを試してみました:

#!/bin/bash 
awk '{printf "%13-s %-8s %-2s %-5s %-3s\n", $1, $2, $3, $4, $5}' sample.txt > new.txt 

そしてそれは、この結果に失敗します:上記のようにテキストファイルが区切り形式になりますので、誰もがこれを微調整することができれば

Name   City  ST Zip CTY 

John   Smith BrooklynNY10050USA 

Paul   DavidsonQueens NY10040USA 

Michael  SmithNY NY10030USA 

George  HermanBronx NY10020USA 

はそれをお願い申し上げます。どうもありがとうございます!! gawkので

答えて

1

あなたはBEGINブロック内の入力フィールドの幅を設定することができます。

$ gawk 'BEGIN { FIELDWIDTHS = "13 8 2 5 3" } { print $1, $2, $3, $4, $5 }' fw.txt 
Name   City  ST Zip CTY 
John Smith Brooklyn NY 10050 USA 
Paul Davidson Queens NY 10040 USA 
Michael Smith NY  NY 10030 USA 
George Herman Bronx NY 10020 USA 

あなたのawkがFIELDWIDTHSを持っていない場合、それは少し面倒ですが、あなたはsubstrを使用することができます。

$ awk '{ print substr($0,1,13), substr($0,14,8), substr($0,22,2), substr($0,24,5), substr($0,29,3) }' fw.txt 
Name   City  ST Zip CTY 
John Smith Brooklyn NY 10050 USA 
Paul Davidson Queens NY 10040 USA 
Michael Smith NY  NY 10030 USA 
George Herman Bronx NY 10020 USA 
+0

こんにちは、私はFIELDWIDTHSを持っており、これは素晴らしい作品であり、とても覚えやすいです。どうもありがとうございました! – user3395315

1

sedを使用して、特定の位置にスペースを挿入することができます。

cat data.txt | sed -e 's#\(.\{13\}\)\(.*\)#\1 \2#g' | sed -e 's#\(.\{22\}\)\(.*\)#\1 \2#g' |sed -e '1s#\(.\{29\}\)\(.*\)#\1 \2#g' | sed -e '2,$s#\(.\{25\}\)\(.*\)#\1 \2#g' | sed -e 's#\(.\{31\}\)\(.*\)#\1 \2#g' 
+0

ありがとうトマス!これは非常にうまくいく。 – user3395315

1

あなたは$0かけてループ配列にフィールドの長さを分割し、定期的なawkの中のサブストリングを集めることができます。

awk 'BEGIN {n=split("13 8 2 5 3",ar)} 
      { 
      j=1 
      s="" 
      sep="\t" 
      for(i=1;i<n;i++) 
       {s=s substr($0, j, ar[i]) sep; j+=ar[i]} 
      s=s substr($0, j, ar[i]) 
      print s 
      }' file 

フィールドを区切るためにタブを使用しますが、好適な場合にもスペースを使用することができます。

+1

これは非常にいいですし、それはまた素晴らしい作品です!これについて思考プロセスを評価してください。今までこれを行う方法がたくさんあることはわかりませんでした。 – user3395315

関連する問題