2012-06-27 10 views
10

mit Ich habe diese selbst definierte Funktion in meinem .bashrc:eine benutzerdefinierte bash Funktion in xargs

function ord() { 
    printf '%d' "'$1" 
} 

Wie bekomme ich diese Funktion mit xargs verwendet werden:

cat anyFile.txt | awk '{split($0,a,""); for (i=1; i<=100; i++) print a[i]}' | xargs -i ord {} 
xargs: ord: No such file or directory 
+0

Warum ist diese Downvoted bekommen? – lonestar21

+0

Vielleicht für die UUOC? Ich bin nicht der Downvoter – jordanm

Antwort

7

Erstens, Ihre Funktion verwendet nur 1 Argument, so dass die Verwendung von Xargs hier nur den ersten Arg übernimmt. Sie müssen die Funktion der folgenden Änderungen:

ord() { 
    printf '%d' "[email protected]" 
} 

Um xargs eine Funktion von Ihrem bashrc zu verwenden, müssen Sie eine neue interaktive Shell laichen. So etwas wie dies funktionieren kann:

awk '{split($0,a,""); for (i=1; i<=100; i++) print a[i]}' anyFile.txt | xargs bash -i -c 'ord [email protected]' _ 

Da Sie bereits je nach Wort Splitting, man konnte nur Ausgang des Speichers awk in einem Array.

arr=(awk '{split($0,a,""); for (i=1; i<=100; i++) print a[i]}' anyFile.txt) 
ord "${arr[@]}" 

Oder Sie awk die printf verwenden können:

awk '{split($0,a,""); for (i=1; i<=100; i++) printf("%d",a[i])}' anyFile.txt 
+0

Für die alle awk-Lösung wird es nicht korrekt konvertieren. Zahlen werden als Ziffern gedruckt, während Buchstaben in "0" umgewandelt werden. Ich möchte ASCII-Werte in ganze Zahlen konvertieren. – lonestar21

+2

Oder Sie können die Funktion exportieren ('export -f') und * nicht * die Shell interaktiv machen. –

0

Im trivialen Fall können Sie /usr/bin/printf verwenden:

xargs -I {} /usr/bin/printf '%d' "'{}"