2016-03-28 39 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 

將不勝感激,如果有人可以調整這使文本文件將在分隔的格式,如上圖所示。非常感謝!!

回答

1

隨着GAWK可以在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

感謝Tomas!這工作得很好。 – 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