Привет, я сейчас пытаюсь выполнить следующий код. Я сохранил строку внутри переменной DATE в формате ГГГГ/ММ/ДД. Я пытаюсь извлечь год с помощью команды cut. Я получаю сообщение об ошибке, что это не файл или каталог. Есть ли модификация, которую я мог бы сделать, или другой способ сделать это?

for file in ~/filesToSort/*
do

   DATE=$(head -1 $file | tr "-" "/")
   echo "${DATE}"
   YYYY=$(cut -c1-4 accounts $DATE)
   #echo "${YYYY}"
done

Благодарность

0
muru 21 Окт 2021 в 17:17
Является ли первая строка каждого файла в ~/filesToSort/* датой в формате ГГГГ-ММ-ДД?
 – 
GMaster
21 Окт 2021 в 17:11

3 ответа

Лучший ответ

Утилита cut считывает данные из своего стандартного потока ввода, она не работает со строками, переданными в качестве аргументов.

Следовательно, чтобы использовать cut, вам нужно передать данные на стандартный ввод:

YYYY=$( printf '%s\n' "$DATE" | cut -d '/' -f 1 )

Однако это было бы очень медленно в цикле. Вместо этого используйте встроенную подстановку параметров, чтобы удалить все после первого / в строке $DATE:

YYYY=${DATE%%/*}

Это удалит самую длинную строку суффикса из $DATE, которая соответствует шаблону оболочки /*. Если строка 2021/10/21, возвращается 2021.

Чтобы получить первые четыре символа каждого файла в каталоге (что является сутью того, что, как я полагаю, пытается сделать ваш текущий код), вы можете использовать sed следующим образом:

for name in "$HOME"/filesToSort/*; do
    sed -e 's/\(....\).*/\1/' -e q "$name"
done

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

6
they 21 Окт 2021 в 17:15
Это то, чему мне действительно нужно научиться
 – 
eftshift0
21 Окт 2021 в 17:15

Если ваша оболочка поддерживает это, вы можете использовать здесь строки (<<<) для этого. От man bash:

Here Strings
       A variant of here documents, the format is:

              [n]<<<word

       The word undergoes tilde expansion, parameter and variable  expansion,
       command  substitution, arithmetic expansion, and quote removal.  Path‐
       name expansion and word splitting are not performed.   The  result  is
       supplied  as  a single string, with a newline appended, to the command
       on its standard input (or file descriptor n if n is specified).

В вашем случае вы бы сделали:

for file in ~/filesToSort/*
do

   date=$(head -1 "$file" | tr "-" "/")
   echo "${DATE}"
   yyy=$(cut -c1-4 <<< "$date")
   echo "$yyy"
done
0
terdon 21 Окт 2021 в 17:25

Еще один способ использования старого доброго awk

for file in *; do
    awk -F'-' 'NR==1 {print $1}' $file
done
  • -F '-' говорит awk использовать - в качестве разделителя
  • NR==1 указать awk читать только первую строку каждого файла
  • {print $1} печатать только первое поле, разделенное разделителем
0
GMaster 21 Окт 2021 в 17:39