печатать строки, в которых каждое слово содержит два одинаковых символа в Linux

Не решение вашей проблемы, но работает, если использовать maimвместо scrot. Кроме того, я использую xclipдля автоматического копирования изображения в буфер обмена, что очень удобно.

awful.key({}, "#107",
  function ()
    awful.util.spawn_with_shell("FILE=".. os.getenv("HOME").. "/Media/Screenshots/snapshot-$(date +%Y-%m-%dT%H-%M-%S).png && maim -s --hidecursor $FILE && xclip -selection clipboard $FILE -t image/png")
  end),

1
23.10.2021, 22:19
3 ответа

Использование любого awk в любой оболочке на каждом компьютере Unix:

awk '{
    for ( fldNr=1; fldNr<=NF; fldNr++ ) {
        numChars = length($fldNr)
        numUnq = 0
        split("",seen)       # you could use delete(seen) here in most awks
        for ( charNr=1; charNr<=numChars; charNr++ ) {
            if ( !seen[substr($fldNr,charNr,1)]++ ) {
                numUnq++
            }
        }
        if ( numUnq == numChars ) {
            next
        }
    }
    print 
}' file
LTCYMM SVNNDA DTVEV QLOPGO CUPUR
KKPQBP BKDKRU ZTPDPL ZRLUEL HRZZKO KXSKCU YZQTBT RISNKS
2
24.10.2021, 19:19

Используя perlвместе с методом allиз модуля List::Utilмы можем обнаружить нужные строки (все слова, содержащие хотя бы один повторяющийся символ)

perl -MList::Util=all  -lane '
  print if all { /(.).*\1/ } @F;
' file

С помощью GnU sedмы можем выбрать нужные строки, убедившись, что все нужные поля растягиваются от начала строки до конца.

$ sed -En '/^\s*(\S*(\S)\S*\2\S*(\s+|$))+$/p' file

Другой способ с sedсостоит в том, чтобы постепенно проверять наличие повторяющихся символов среди символов, отличных от пробелов. и не печатайте пространство шаблона, как только не будет найдено дубликатов в наборе символов без пробелов.

sed -Ee 'h
  :loop
    s/^\s+|\s+$//g
    s/\S+/&\n/
    /(\S).*\1.*\n/!d
    s/^[^\n]*\n//
  /./bloop
  g
' file

Мы используем awk, а затем перебираем в цикле каждое слово и каждый символ в слове. Разделите слово на char и проверьте, не разбивается ли оно более чем на 2 части => в этом слове обнаружен дубликат. Аналогично в конце текущей строки, если количество обнаруженных дубликатов равно количеству полей => строка подходит для печати.

awk '
{
  for (p=i=1+(w=0); i<=NF; i++) {
    while (p <= length($i)) {
      c = substr($i,p++,1)
      if (split($i,a,c) > 2) {
        w += p = 1
        break
      }
    }
  }
}
w==NF
' file
0
24.10.2021, 22:12

Вот еще одно решение на чистом Bash — нет perl, нет grep, нет awk.

#!/bin/bash
set -euo pipefail

containssametwice() {
  local -Ai chars=()
  local -i i
  for ((i = 0; i < ${#1}; ++i)); do
    ((++chars["${1:i:1}"] < 2)) || return 0
  done
  return 1
}

while IFS= read -r line; do
  read -ra words <<< "$line"
  for word in "${words[@]}"; do
    containssametwice "$word" || continue 2
  done
  printf '%s\n' "$line"
done
0
25.10.2021, 00:22

Теги

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