как удалить повторяющийся номер из строки? [закрыто]

Вы можете заменить system(" \"$0\"") способностью awk записывать в процесс, т.е. print $0 | "pre; \"$v\"", где часть 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); }'
0
12.07.2018, 09:23
5 ответов

Вы можете использовать tr, awkили sed, чтобы получить все числа в отдельной строке, затем использовать sortи uniq, чтобы удалить повторяющиеся записи

Пример с tr:

$ tr " " "\n"  < <INPUT-FILE> | sort -u | tr "\n" " "
0
28.01.2020, 02:16

Перл спешит на помощь!

perl -lane 'print join " ", grep ! $seen{$_}++, @F' < file
  • -lудаляет новые строки из ввода и добавляет их в вывод
  • -nобрабатывает ввод построчно
  • -aразбивает каждый ввод пробелов на массив @F

Массив @F повторяется с помощью grep , сохраняя только те элементы, которые видны впервые (т. е. их значение в хэше %seen равно нулю, так как отрицание нуля верно ). join просто склеивает их вместе.

3
28.01.2020, 02:16

Вы можете сделать это с помощью 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.

0
28.01.2020, 02:16

Простой способ достижения этого в стиле Unix состоит в том, чтобы использовать базовые базовые утилиты и передавать содержимое test.txt в соответствующую программу, а не использовать -полноценный скриптовый язык:

$ cat test.txt | tr ' ' '\n' | sort -u | tr '\n' ' '
0
28.01.2020, 02:16

В 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>
0
28.01.2020, 02:16

Теги

Похожие вопросы