2012-11-22 46 views
1

我有一個文本文件,並試圖提取文件的第一行(或行)中的數據,其中每個數據保存爲列表(因此每個點都保存在它是自己的行)在一個新的文件。保存第一行 - Linux Shell腳本

例如data.txt中:

Name Col Samp1 Samp2 Samp3 Samp4 Samp5 Samp6 
Car1 Red 49.3 43.2 54.3 52.3 12.5 76.8 
Car2 Blu 56.3 12.4 85.4 67.1 24.5 32.5 
and so on.. 

我想一個新的列表看起來是這樣,並保存到一個新的文件名爲samps.txt:

Samp1 
Samp2 
Samp3 
Samp4 
Samp5 
Samp6 

我是很新的shell腳本,並可以使用任何人都可以提供的幫助。

回答

0

閱讀的第一行到一個變量

read -r FIRSTLINE < filename 

分割字符串成字

WORDS=($FIRSTLINE) 

循環通過字,並將其輸出到文件

for WORD in ${WORDS[@]} 
do 
    echo $WORD >> outputfilename 
done 

你的情況,你想放棄前兩列的值。您可以在for語句中使用${WORDS[@]:2對數組進行分片。或者,您可以在將它們回送到文件之前測試for循環中的值。

+0

@Enrico嗨。感謝您的幫助。我嘗試了您的建議,首先通過測試循環內的值,但是沒有任何內容正在打印。該腳本似乎運行,因爲沒有錯誤,但我沒有得到所需的輸出。有什麼建議? – Sheila

+0

@ShilaP確保在運行for循環代碼之前運行前兩個命令來填充WORDS數組變量。否則數組是空的,它不會打印任何東西 – Enrico

+0

我已經試過 – Sheila

2

使用read -a將行讀入array,然後使用for遍歷數組元素。有關更多詳細信息,請參閱help

2

這將這樣的伎倆:

$ head -1 data.txt | grep -o 'Samp[0-9]*' 

Samp1 
Samp2 
Samp3 
Samp4 
Samp5 
Samp6 

說明:

  1. 顯示文件的第一行:head -1 data.txt

  2. |採取的最後一個命令的輸出並將其用作下一個(稱爲管道)的輸入。

  3. 打印出給定regex的比賽:grep -o 'Samp[0-9]*'

regex'Samp[0-9]*'將匹配開始Samp後跟任何數字的字符串。

要保存輸出到samps.txt使用重定向操作>

$ head -1 data.txt | grep -o '\w*' | tail -n +3 > samps.txt

grep -o '\w*'比賽:

$ head -1 data.txt | grep -o 'Samp[0-9]*' > samps.txt

這將爲任何列標題不僅僅是匹配'Samp[0-9]*'是那些工作字和tail -n +3顯示從第3行開始的所有行(即不顯示前兩列標題)

0

處理與字段中的文本文件時,您可能會發現awk一個有價值的工具:

awk 'NR==1 { for(i=3;i<=NF;i++) print $i }' file 

結果:

Samp1 
Samp2 
Samp3 
Samp4 
Samp5 
Samp6 

說明:

NR is short for the number of rows. 
NF is short for the number of fields in the row. 
0

只需使用bash:

set -- $(head -1 data.txt)  # save the words in the first line as $1,$2,... 
shift 2       # discard the first two words 
printf '%s\n' "[email protected]" > samps.txt # print each remaining word on its own line 
0

我upvoted伊格納西奧巴斯克斯 - 艾布拉姆斯的答案,因爲它是最好的選擇,只使用純粹的bash。由於他不給一個完全工作的例子,這裏有一個:

read -a samps < "myfile.txt" 
printf "%s\n" "${samps[@]:2}" 

輸出:

Samp1 
Samp2 
Samp3 
Samp4 
Samp5 
Samp6