2013-02-04 92 views
0

執行awk命令我有提取從3號線16列在CSV文件中,並打印前4個字符的awk命令。如何在shell腳本

awk -F"," 'NR==3{print $16}' sample.csv|sed -e 's/^[ \t]*//'|awk '{print substr($0,0,4)}' 

這工作正常。

但是,當我從一個shell腳本執行它,我得到的和錯誤

#!/bin/ksh 
YEAR=awk -F"," 'NR==3{print $16}' sample.csv|sed -e 's/^[ \t]*//'|awk '{print substr($0,0,4)}' 

錯誤消息:

-F,: not found 
+1

你嘗試'YEAR = $(你的awk的東西| sed的| awk的| sed的| awk ...)' – Kent

+0

真棒!這真的工作..感謝 – user2040307

+0

高興地幫助。順便說一句,你的'awk | sed | awk'組合起作用了,但它就像是用核彈殺死一隻蒼蠅,還有三枚核彈......必須有改進的空間。那麼,首先就是讓它工作。 :) – Kent

回答

1

使用command substitution到命令的輸出分配給一個變量,如圖所示如下:

YEAR=$(awk -F"," 'NR==3{print $16}' sample.csv|sed -e 's/^[ \t]*//'|awk '{print substr($0,0,4)}') 
0

你正在問殼做:

VAR=value command [arguments...] 

這意味着:推出command,但它傳遞VAR=value環境第一 (例如:LC_ALL=C grep '[0-9]*' /some/file.txt:將grepfile.txt一些(這與LC_ALL變量設置爲C只爲grep呼叫的持續時間)

所以在這裏:你問的外殼啓動-F","命令(即-F,一旦外殼解釋",",帶參數'NR==3..........並與可變YEAR在命令調用期間設置爲值awk

只需將其替換爲:

#!/bin/ksh 
YEAR="$(awk -F',' 'NR==3{print $16}' sample.csv|sed -e 's/^[ \t]*//'|awk '{print substr($0,1,4)}')" 

(我沒有嘗試,但我希望他們爲你和你的sample.csv文件工作)

(請注意,您使用「0」匹配字符位置1,這在許多awk的實施工作,但不是所有的(即大多數(但不是全部)假設1,當你寫0))

+0

你更好的封裝之內「」整個命令substition像我一樣,否則如果返回超過1個字,你最終會調用另一個'VAR =字詞1字詞2 ....調用命令的''WORD2 .. ..'var'的值設置爲'word1' –

0

從你的描述,它看起來像你想從提取的一年第16場,可能包含領先空間。你可以通過調用AWK來完成它:

YEAR=$(awk -F, 'NR==3{sub(/^[ \t]*/, "", $16); print ">" substr($16,1,4) "<" }') 

更棒的是,你甚至不需要使用awk。既然你已經編寫shell腳本,讓我們做這一切在shell腳本:

{ read line; read line; read line; } < sample.csv # Get the third line 
IFS=, set $line # Breaks line into comma-separated fields 
IFS=" " set ${16} # Trick to remove leading spaces, field 16 becomes field 1 
YEAR=${1:0:4}  # Extract the first 4 char from field 1 
+1

關於awk腳本的好建議,但不要做shell之類的事情,因爲它容易出錯(例如,如果「line」包含反斜槓或其他各種字符將會失敗)並且很麻煩(嘗試修改它在第67行而不是第3行)。 –

+0

我同意關於容易出錯的部分。修改爲使用3以外的行並不難。 –

+0

軟件沒有什麼是「那麼難」。它只是軟件。關鍵是雖然你不會寫67個「讀線」語句,所以即使你很高興在這個腳本中有3個重複的,硬編碼的語句,你仍然需要在某個時候重寫腳本來處理一個不同的行號,因此我聲稱這很麻煩,我的建議是不要這樣做。 –

0

這樣做:

year=$(awk -F, 'NR==3{sub(/^[ \t]+/,"",$16); print substr($16,1,4); exit }' sample.csv) 
+0

謝謝大家爲你提供精彩的輸入。我有一個美好的一天! – user2040307