2012-09-17 58 views

回答

1

我認爲這會爲你工作,未經測試:

awk 'NR >= 5 && NR <= 5 + Y { print $X }' file.txt 

顯然,替代XY一些真正的價值。

編輯:

如果XY是shell變量:

awk -v column="$X" -v range="$Y" 'NR >= 5 && NR <= 5 + range { print $column }' file.txt 
+0

爲'-F'分隔符添加一個參數,就完成了!:) –

+0

只是將它們拼湊在一起(假設'X列'表示第X行字符):'awk -v FS ='''NR> = 5 && NR <= 5 +'$ Y'{print $'$ X'}'file.txt'。請注意,shell變量直接拼接到awk語句中。還好奇地注意到(至少在OS X 10.8.1上),不能通過-F選項指定_empty_字段分隔符,因此通過'-v'定義。 – mklement0

+0

@mklement:你應該假定一列是_field_,而不是行上的_Nth_字符。雖然你可以用簡單的shell變量來打破awk語句,但是在使用它們之前分配它們通常會更清晰。它也可以幫助減少重複的代碼。 – Steve

0

如果「列」你的意思是你有,比如說,用逗號分隔的字段的文件,你想提取一個特定的領域,接受的答案很好地做到了。回顧一下,

awk -F , 'NR==5 { print $6 }' file 

從逗號分隔文件中第5行提取第六個字段。如果您的分隔符不是逗號,請將其他參數作爲參數傳遞給-F選項。 (用GNU awk中,你可以通過一個正則表達式來-F指定相當複雜的列分隔符,但如果你需要的是,去找到那個特定的情況下一個更具體的問題。)

如果「列」你的意思是一個固定的字符在一行內的位置,substr功能就是這樣做的。

awk 'NR == 5 { print substr($0, 6) }' file 

打印第六列及其後的所有內容。如果要限制到一個固定的寬度,

awk 'NR == 5 { print substr($0, 6, 7) }' file 

打印七個字符起始於偏移6(awk中索引從1開始,所以偏移1是線路上的第一個字符)上線5.如果你不知道到底有多少字符將被提取,但你想一個數字,用awk方便地讓你從一個字符串的開始提取號碼:

awk 'NR == 5 { print 0 + substr($0, 6, 7) }' file 

將提取相同的7個字符,但隨後強迫的結果到號碼,有效地修剪任何非數字後綴,並打印。

在最一般的情況下,您可能需要對已提取的值執行進一步拆分。

awk 'NR == 5 { split(substr($0, 6), a, /:/); print a[1] }' file 

將在正則表達式/:/(在這個簡單例子中,正則表達式匹配簡單地文字冒號)分裂所提取的子到陣列a。然後,我們打印第一個元素a,這意味着我們將所有從子索引中的第一個冒號開始的所有內容從索引6開始並延伸到行號5的行尾。

(爲了讓您免受要查看它,$0是整個當前的輸入行,awk逐行處理一個文件,依次在每行上運行腳本的主體,如果需要將shell變量暴露給awk,awk -v awkvariable="$shellvariable"就是這樣做的。)