2014-09-10 30 views
1

我要做的是從解析列表中創建一個csv文件。解析列表文件(awk/bash)

[input.txt] 

This is a list of all gadgets. 
Version: 11 
Created by: jayFour 

1 Toy no ordered 
2 Box no ordered 
3 Spade yes in_stock 
4 Nail yes in_stock 
5 Chair no ordered 
6 Table yes in_stock 
7 Apple no ordered 
9 Phone yes in_stock 

# generated 2014 

現在,我創建了一個腳本,應該做一個 'AWK',創造了我的CSV文件是這樣的:

[output.csv] 

| ID | Item | Status | Stock  | 
| 3 | Spade | yes  | in_stock | 
| 4 | Nail | yes  | in_stock | 
| 6 | Table | yes  | in_stock | 
| 9 | Phone | yes  | in_stock | 

「|」代表表格邊界。

腳本:

#!/bin/bash 

ifiles=`ls input.txt` 

for ifile in $ifiles 
do 
    echo "ID;Item;Status;Stock\r" > output.csv 
    id=`awk '/yes/' $ifiles | awk {'print $1'}` 
    itm=`awk '/yes/' $ifiles | awk {'print $2'}` 
    stat=`awk '/yes/' $ifiles | awk {'print $3'}` 
    stck=`awk '/yes/' $ifiles | awk {'print $4'}` 
    echo "$id;$itm;$stat;$stck\r" >> output.csv 
done 

你可以想像,沒有工作這種方式。我在我的CSV(也許通過線缺陷造成的讀入/解析我輸入文件中的行內得到了與斷裂問題

好 - 如何解決:)

+0

你在哪裏使用變量「ifile」? - 未使用 – Jdamian 2014-09-10 14:31:50

+1

變量「ifiles」僅包含「input.txt」。你想要什麼? – Jdamian 2014-09-10 14:34:06

+0

我縮短了我的腳本。我使用「ifile」來生成輸出文件名。不在這裏,但沒關係,我猜。 – jayFour 2014-09-10 14:36:21

回答

1

此實現你的願望。

cat input.txt | awk 'BEGIN { print "ID;Item;Status;Stock" }; /yes/ { printf "%s;%s;%s;%s\n", $1,$2,$3,$4 }'

被放置在你的循環當然。

說明:首先打印Header(BEGIN塊),然後對每一行打印yes,打印由';'分隔的每個字段。

在awk中有更優雅的方法,但起初不太容易理解。

即:cat input.txt | awk 'BEGIN { OFS=";"; print "ID","Item","Status","Stock" }; /yes/ { print $1,$2,$3,$4 }'

這裏我讓AWK通過給他在BEGIN塊中的輸出字段分隔符(OFS)管理輸出;

輸出是:

ID;Item;Status;Stock 
3;Spade;yes;in_stock 
4;Nail;yes;in_stock 
6;Table;yes;in_stock 
9;Phone;yes;in_stock 

編輯的完整性:你來砸將成爲:

#!/bin/bash 

ifiles=`ls input.txt` 
echo "ID;Item;Status;Stock\r" > output.csv 

for ifile in $ifiles 
do  
    cat $ifile | awk 'BEGIN { OFS=";"}; /yes/ { print $1,$2,$3,$4 }' >> output.csv 
done 

正如你可能不希望重複的標題,它是在循環前完成,不再在awk部分。

+1

awk完全可以打開文件,所以UUOC。每當你發現自己編寫一個shell循環來操縱文本時,你就有錯誤的方法。 – 2014-09-10 17:03:20

+0

我沒有預防教人如何做得更好。我試圖儘可能地回答這個問題,因爲它可能是一個簡化的部分。我很樂意延續,但我並沒有妄想猜測操作頭中的內容,因爲它是如何理解SO指導方針的:不要回答你應該使用別的東西。 OP可以有其他需要的文件名,而不僅僅是產生一個分隔文件bur沒有暴露他們在這裏,因爲它不是他的問題...(抱歉,如果我聽起來粗魯(這個評論聽起來很粗魯),我的英語變得越來越差最近) – Tensibai 2014-09-10 18:24:28

+0

不,你聽起來不粗魯。回答一個問題以幫助OP是完全合理的,並且評論一個問題的答案以幫助答案和OP的海報也是完全合理的。在這兩種情況下,我們只是試圖幫助。通常OP會告訴OP使用別的東西,因爲他們經常會問如何實現他們能想到的唯一解決方案(例如,「如何在sed中逃避特殊字符?」),當他們真的應該問如何解決問題時(例如,「我如何用字符串b替換字符串a,而不管它們包含什麼字符?」),以便他們可以學習更好的解決方案。 – 2014-09-10 22:21:23

2

開始與此:

awk -v OFS=';' ' 
BEGIN { print "ID","Item","Status","Stock" } 
$3=="yes" { $1=$1; print } 
' $ifiles 

讓我們知道,如果有什麼需要改變。請注意,我將根據您需要做的這一假設而做出扣除$ ifiles的引用,並理解所有相關的注意事項。

+1

謝謝。有你的意思。 – jayFour 2014-09-11 07:10:23