2014-01-18 1 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 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"]}' 
Смежные вопросы