2013-05-03 63 views
0

我有一個文本文件,field1; field2; field3在一行中。 我需要製作一個只包含3個字段,例如下面的其他文件:在Linux中轉換文本文件

原文:

yast2-storage-lib;2.13.108-0.4.226; 
yast2-storage-lib;2.13.108-0.4.226;2.13.112-0.6.1 
yast2-storage-lib;2.13.112-0.6.1; 
yast2-storage;2.13.108-0.4.226; 
yast2-storage;2.13.108-0.4.226;2.13.112-0.6.1 

期望的結果:

yast2-storage-lib;2.13.108-0.4.226;2.13.112-0.6.1 
yast2-storage;2.13.108-0.4.226;2.13.112-0.6.1 

有人能幫助我嗎?我現在已經測試了幾個小時,但是我無法提供所需的結果,而且我的文本轉換技能幾乎沒有,據我所知。 我嘗試了'grep','awk'和'sed',但正如我所說的,我缺乏exp。

回答

0

你在awk的正確軌道上。在AWK $ N是字段,以便打印的第一和第三場例如在命令行應鍵入

awk '{print $1, $3}' <input file> > <output file> 

有這樣做取決於具體要求的其他方式。如果您需要尋找線路上的圖案,如版本,然後打印特定的字段你應該使用

awk '/pattern/ {print $1, $3}' <input file> > <output file> 

我會通過herehere瀏覽開始。在那之後,我會通過awk/gawk單行程來查看你可能需要做的事情。它可能看起來像你的貓走過鍵盤,但它可以節省你幾個小時的繁瑣工作。

+0

[UUoCA](http://partmaps.org/era/unix/award.html ) – 2013-05-03 19:35:05

+0

嗨,麥凱,謝謝你的支持。 我測試了你的解決方案,但我總是得到這個: cat sles10.4-updates.txt | awk {print $ 1,$ 3}> teste awk:cmd。行:1:{print awk:cmd。行:1:^意外的換行符或字符串的結尾 但是,謝謝你提供了命令執行的完整解釋。我肯定會探討這一點,因爲我現在需要做這樣的工作。 我在我的搜索過程中偶然發現了這個網站,我從未期待過你和其他人做出如此快速的迴應。 根據我對正確答案的想法給予學分,但所有人對幫助我都很棒。 – Maggo 2013-05-04 03:23:22

+0

不要在這種情況下使用貓,它會工作,但這是一個不好的習慣,通常是不必要的。 – Matty 2013-05-06 11:15:13

2
grep ';.*;.' 

選擇所有包含至少兩個分號的行,其間的任何內容以及第二個分號後的至少一個字符。您可能不得不修剪線條上的空格。

+0

嗨Larsmans,感謝您的支持。 這按要求工作,謝謝。 JG – Maggo 2013-05-04 03:09:57

2

如果你確定你沒有尾隨空白:

awk -F\; \$3 file.txt 

如果你這樣做:

awk -F\; '$3~/\S/' file.txt 

或者awks不承認\S

awk -F\; '$3~/[^ \t]/' file.txt 

使用;作爲字段分隔符,如果第三個字段不爲空,則打印該行。

+0

嗨凱文,感謝您的支持。 第一個選項按需要工作,第二個選項沒有。我只是想你想知道。 – Maggo 2013-05-04 03:07:01

+0

@ user2348098看起來默認的mac/bsd awk不能識別'\ S',我添加了非gnu兼容版本 – Kevin 2013-05-04 03:15:22

2

使用SED刪除在;

sed '/;$/d' 
0

這個怎麼樣結束所有行?

$ cat yast 
yast2-storage-lib;2.13.108-0.4.226; 
yast2-storage-lib;2.13.108-0.4.226;2.13.112-0.6.1 
yast2-storage-lib;2.13.112-0.6.1; 
yast2-storage;2.13.108-0.4.226; 
yast2-storage;2.13.108-0.4.226;2.13.112-0.6.1 
$ awk -F";" '{for(i=2;i<=NF;i++){if(!b[$i]&&$NF!=""){b[$i]=$i;if(length(s)>0){s=s";"$i}else{s=$i}}};a[$1]=$1";"s}END{for(i in a){print a[i]}}' yast 
yast2-storage;2.13.108-0.4.226;2.13.112-0.6.1 
yast2-storage-lib;2.13.108-0.4.226;2.13.112-0.6.1 
+0

@ user2348098:你試過這個嗎? – tink 2013-05-05 08:54:49