printf печать моих переменных в неправильном порядке

#bash

#bash

Вопрос:

printf печатает мои переменные в неправильном порядке, и перевод строки не работает. после итерации по различным операторам printf он по-прежнему не работает, и я не совсем уверен, что не так.

это мой текущий код:

 cat ~/data/quotes.csv | while IFS=, read author quote; do
author_s=$(echo $author | cut -d'"' -f 2) # removes quotations - e.g. turns "Jonathan Kozol" to Jonathan Kozol 
printf "$quotent~$author_s"
done | sort -R | tail -1 # print one random line from quotes.csv
  

это мой вывод (я также не уверен, что вызывает ошибку):

 -bash: printf: `w': invalid format character
    ~ Jonathan Kozol"Don't compromise yourself. You are all you've got."
  

тем не менее, я хотел бы получить что-то вроде этого:

 "Don't compromise yourself. You are all you've got."
    ~ Jonathan Kozol
  

кроме того, когда я пытаюсь напечатать переменные $author_s и $quote в отдельных строках

например

 printf "$quoten"
printf "$author_s"
  

автор не печатает

Первая часть quotes.csv :

 "Author","Quote"
"Thomas Edison","Genius is one percent inspiration and ninety-nine percent perspiration."
"Yogi Berra","You can observe a lot just by watching."
"Abraham Lincoln","A house divided against itself cannot stand."
"Johann Wolfgang von Goethe","Difficulties increase the nearer we get to the goal."
"Byron Pulsifer","Fate is in your hands and no one elses"
"Lao Tzu","Be the chief but never the lord."
"Carl Sandburg","Nothing happens unless first we dream."
"Aristotle","Well begun is half done."
"Yogi Berra","Life is a learning experience, only if you learn."
"Margaret Sangster","Self-complacency is fatal to progress."
"Buddha","Peace comes from within. Do not seek it without."
  

Комментарии:

1. Вы понимаете, что ваш вопрос и автор будут в отдельных строках, поэтому, если вы напечатаете одну случайную строку, в ней будет напечатано либо имя автора, либо цитата?

2. @TedLyngmo что означает тире для in n- ? кроме того, я пробовал ваш код, и он печатает только цитату

3. @KamilCuk правильно, ЛОЛ. упс

4. @TedLyngmo большое спасибо, но все равно печатается только цитата:/ я должен также упомянуть, что даже когда я пытаюсь printf «$quote n», после цитаты не остается пустой строки

5. В любом случае, OP, который вы хотите: shuf -n1 quotes.txt | while read ....

Ответ №1:

Первый аргумент to printf должен содержать строку формата. Ваш конкретный формат будет "%snt~ %sn" :

  • Первая %s — это фактическая цитата
  • nt новая строка и табуляция
  • ~ %sn тильда, автор и новая строка

Пример:

 #!/bin/bash

while IFS=, read -r author quote
do
    author="${author%"}" # remove first "
    author="${author#"}" # remove last "
    printf "%snt~ %sn" "$quote" "$author"
done < quotes.csv
  

Чтобы выбрать случайную цитату, вы могли бы использовать shuf :

 #!/bin/bash

tail -n  2 quotes.csv | shuf -n1 | while IFS=, read -r author quote
do
    author="${author%"}" # remove first "
    author="${author#"}" # remove last "
    printf "%snt~ %sn" "$quote" "$author"
done
  

Здесь tail -n 2 quotes.csv пропускается первая строка в файле ( "Author","Quote" ) и shuf -n1 выбирается одна случайная строка.

Снова второй пример, но вместо этого используется подстановка процесса:

 #!/bin/bash

while IFS=, read -r author quote
do
    author="${author%"}" # remove first "
    author="${author#"}" # remove last "
    printf "%snt~ %sn" "$quote" "$author"
done < <(shuf -n1 <(tail -n  2 quotes.csv))
  

Комментарии:

1. второе решение сработало как шарм оно такое чистое!! большое вам спасибо за вашу помощь 🙂

2. упс, нет, совсем не проблема! на самом деле, у меня была открыта «старая» вкладка, где я еще не принял ваш ответ и подумал, что галочка не прошла! должно быть исправлено сейчас