2014-01-18 35 views
1

因程序而改變列的值我有一個這樣的輸入:在Unix中

12 abc 13 14 
13 def 14 15 
1 lce 22 14 

而且我想通過應用程序./program第二列來改變它:

12 P1 13 14 
13 P2 14 15 
1 P3 22 13 

(如果echo "abc" | ./program返回「P1」,echo "def" | ./program返回「P2」等)。我該怎麼做?

回答

4

使用while循環讀取:

while read -r one two rest 
do 
    echo "$one $(./program <<< "$two") $rest" 
done < inputfile 
2
while read a b c d ; do echo $a $(./program <<< $b) $c $d ; done < t 

其中t是文件的名稱。

0

我認爲最簡單的方法是使用while循環。

while read -r line; do 
    old="$(echo "$line" | tr -s ' ' | cut -d ' ' -f 2)" 
    new="$(echo "$old" | ./program)" 
    echo "$line" | sed "s/$old/$new/" 
done 

備註:

  • 我用tr因爲你可能列對齊。 tr -s ' '將多個空格替換爲一。
  • 我使用sed來改變你的行,以免弄亂對齊。
1

這應該做你想要什麼作爲awk腳本

{ 
    "echo "$2" | ./program" | getline result; 
    $2 = result; 
    print; 
} 
0

至於:如果echo "abc" | ./program返回 「P1」,echo "def" | ./program返回 「P2」 等)。我該怎麼做?

程序腳本可能看起來像:

INFILE=input.txt ## your input file 

## exits if no standard input 
if [ -t 0 ] ; then echo "Error: No STDIN" && exit ; fi 

## do something 
while read line; do 
    awk -v input=$line '$2 == input {print "P"NR}' $INFILE 
done 
  • 您指定的程序腳本INFILE後...
  • echo "abc" | sh program返回 「P1」
  • echo "def" | sh program回報「 P2「

鑑於:如果你只是想輸出爲

12 P1 13 14 
13 P2 14 15 
1 P3 22 13 

您可以使用下面的一行代碼:

awk 'BEGIN {OFS="\t"} {$2="P"NR}1' input.txt > outfile.txt 
+0

的'awk'解決方案不好。 OP喜歡在外部腳本中查找值並替換文件中的值,而不僅僅是數字。 – Jotne

+0

對不起,你能澄清一下你的意思嗎? ...哦,你的意思是「程序」腳本已經寫好了..? – csiu

+0

他喜歡根據存儲在他的程序中的表格將某些文本更改爲其他文本。 Eks如果「qwr」更改爲「P84AA」,而不僅僅是一個計數號碼, – Jotne

1

爲什麼不把所有的awk,你需要該程序」?

awk 'BEGIN {n=split("abc def lce",q," ");for (i=1;i<=n;i++) d[q[i]]="P"i} {sub($2,d[$2])}8' file 
12 P1 13 14 
13 P2 14 15 
1 P3 22 14 

它是如何工作

awk ' 
BEGIN {        # Begin block 
    n=split("abc def lce",q," ") # split the list of data in to array "q" and set "n" to number of elements 
    for (i=1;i<=n;i++)    # loop trough all elements 
     d[q[i]]="P"i    # assing P1, P2 etc to first, second element "d[abc]=P1" etc 
    } 
    {sub($2,d[$2])}     # change filed 2 to new element 
    8        # print the new line 
    ' file       # input file 

如果有 「P」 的數據表是不是續集,你可以添加它就像其他表:

awk 'BEGIN {n=split("abc def lce",q," ");split("P2 Q4 A3",r," ");for (i=1;i<=n;i++) d[q[i]]=r[i];print d["def"]}'