2012-03-27 58 views
7

我新的編程語言和東西 所以我有awk的所有線路,以便扭轉和以及在這些線路中的全部的話,從一個文件並打印出來。awk中反向線條和話

「文件1」,以反向:

AA BB CC

FOO做如

與 「文件1」 的輸出打印應該是這樣的:

爲foo的做

CC BB AA

我想這一個字在每一行反向:

for (i=NF; i>1; i--) printf("%s ",$i); printf("%s\n",$1)

,但如果我想打印反轉線我必須這樣做

{a[NR]=$0 
}END{for(i=NR; i; i--) print a[i]} 

我需要在終端與兩個文件的工作用這個命令:

awk -f commandFile FileToBePrinted 

問題是我在這一切beginer,我不知道如何這兩個結合起來。 謝謝!

+0

+1對於提出的問題(第一次!)。良好的格式化,樣本輸入,樣本輸出和代碼不工作!好的展示並繼續發佈! – shellter 2012-03-27 14:43:49

回答

3

千電子伏的解決方案看起來扭轉每個字的文本。你的示例輸出沒有顯示,但他的關鍵是使用一個函數。

你有你需要的代碼,你只需要重新安排它一點。

cat file1 
aa bb cc 
foo do as 

cat commandFile 

function reverse(line) { 
    n=split(line, tmpLine) 
    for (j=n; j>0; j--) { 
    printf("%s ",tmpLine[j]) 
    } 

} 
# main loop 
{ a[NR]=$0 } 

# print reversed array 
END{ for(i=NR; i>0; i--) printf("%s\n", reverse(a[i])) } 

運行

awk -f commandFile file1 

輸出

as do foo 
cc bb aa 

有幾個予製成,使用n=split(line, tmpLine) ... print tmpLine[j]小的變化,是解析線路輸入的在一個的常用方法功能將其打印出來。我不認爲$ 1變量的範圍是從數組中傳入的值(您的a [i]值),所以我將其更改爲split..tmpLine [j]。我還發現,從頂端部分的「我」變量保持在範圍上的功能reverse,所以我改變了到j來消除歧義的情況。


我不得不弄清幾件事情,所以下面是我使用的調試版本。

如果您打算使用gawk,那麼您將學習如何使用可用的調試器。如果你在沒有調試器的系統上使用awk/gawk/nawk,那麼這是理解你的代碼中發生了什麼的一種方法。如果您要重定向您的節目輸出到文件或管道,如果你的系統支持「的/ dev /標準錯誤」的符號,你可以打印調試行出現,即

#dbg print "#dbg0:line=" line > "/dev/stderr" 

一些系統有其他符號訪問stderr,所以如果你會這麼做的話,找出可用的東西是值得的。

cat commandFile.debug 
function reverse(line) { 
    n=split(line, tmpLine) 
    #dbg print "#dbg0:line=" line 
    #dbg print "#dbg1:n=" n "\tj=" j "\ttmpLine[j]=" tmpLine[j] 
    for (j=n; j>0; j--) { 
    #dbg print "#dbg2:n=" n "\tj=" j "\ttempLine[j]=" tmpLine[j] 
    printf("%s ",tmpLine[j]) 
    } 

} 
# main loop 
{ a[NR]=$0 } 

# print reversed array 
#dbg END{ print "AT END"; for(i=NR; i>0; i--) printf("#dbg4:i=%d\t%s\n%s\n", i, a[i] , reverse(a[i]) 
) } 
END{ for(i=NR; i>0; i--) printf("%s\n", reverse(a[i])) } 

我希望這會有所幫助。

2
awk ' 
{ 
    x=reverse($0) (x?"\n":"") x 
} 

END{ 
    print x 
} 

function reverse(s, p) 
{ 
    for(i=length(s);i>0;i--) 
     p=p substr(s,i,1) 
    return p 
}' File1 
2

使用tac來反轉文件的行,然後awk來翻轉單詞。

tac filename | awk '{for (i=NF; i>1; i--) printf("%s ",$i); printf("%s\n",$1)}' 

您也可以使用類似的Perl有內置列表反轉功能:

tac filename | perl -lane 'print join(" ", reverse(@F))'