Вы можете заменить system("
способностью awk записывать в процесс, т.е. print $0 | "pre;
, где часть pre будет считывать стандартный ввод в переменную оболочки v. В bash это будет read -r v
. Вы получите, например, это:
awk 'BEGIN{ cmd="read -r v; ls -ld \"$v\"" }
{ print $0 | cmd; close(cmd); }'
Если вы хотите обрабатывать ужасные вещи, такие как новые строки в именах файлов, вы можете пойти по маршруту print0 в своей находке и, если ваш awk принимает RS='\0'
, у вас есть для bash:
find . -print0 |
awk -v RS='\0' '
BEGIN{ cmd="read -r -d \"\" v; ls -ld \"$v\"" }
{ print $0 "\x00" | cmd; close(cmd); }'
Вы можете использовать tr
, awk
или sed
, чтобы получить все числа в отдельной строке, затем использовать sort
и uniq
, чтобы удалить повторяющиеся записи
Пример с tr:
$ tr " " "\n" < <INPUT-FILE> | sort -u | tr "\n" " "
Перл спешит на помощь!
perl -lane 'print join " ", grep ! $seen{$_}++, @F' < file
-l
удаляет новые строки из ввода и добавляет их в вывод -n
обрабатывает ввод построчно -a
разбивает каждый ввод пробелов на массив @F Массив @F повторяется с помощью grep , сохраняя только те элементы, которые видны впервые (т. е. их значение в хэше %seen равно нулю, так как отрицание нуля верно ). join просто склеивает их вместе.
Вы можете сделать это с помощью sort
. Сортировка работает только со строками, поэтому вам нужно заменить пробелы в файле новыми строками.
Пример, если файл test.txt
содержит:
1 2 3 1 4 5 6 1 1 2 34 5 6 2
Следующий код вернет то, что вы хотите
>sed "s/ /\n/g" test.txt | sort -un
1
2
3
4
5
6
34
Обратите внимание, что хотя sort -u
будет возвращать «уникальные» (не -повторяющиеся значения ), они упорядочены в алфавитном порядке, если только вы не отсортируете числовое значение с помощью sort -n
. Здесь необходима сортировка, так как uniq
удаляет только последовательные дубликаты, поэтому вам все равно придется передавать sort -n | uniq
и sort
.
Простой способ достижения этого в стиле Unix состоит в том, чтобы использовать базовые базовые утилиты и передавать содержимое test.txt в соответствующую программу, а не использовать -полноценный скриптовый язык:
$ cat test.txt | tr ' ' '\n' | sort -u | tr '\n' ' '
В bash :Сохраняет порядок чтения. Читает несколько строк в файле. Возвращает одну строку.
unset d
while read r; do
[ "$d" ] || d=${r/ */}
for s in $r; do
for s2 in $d; do
if [ "$s" = $s2 ]; then
s=
break
fi
done
d="$d $s"
done
done < file
echo ${d}
unset d r s s2
Скрипт лучше
echo '
#!/bin/bash
if [ $# = 0 ]; then
echo "${0##*/} <filepath>" >&2
exit
elif [ ! -f $1 ]; then
echo " Error : $1 is not a file." >&2
exit 1
fi
while read r; do
[ "$d" ] || d=${r/ */}
for s in $r; do
for s2 in $d; do
if [ "$s" = $s2 ]; then
s=
break
fi
done
d="$d $s"
done
done < $1
echo ${d}
' > ~/uniq-word
Для использования:
bash ~/uniq-word <filepath>