Как разделить выходные записи с помощью ',', избегая запятой в конце в awk

Вы можете установить параметр «Force Full Composition Pipeline » в терминале, например:

$ nvidia-settings --assign CurrentMetaMode="nvidia-auto-select +0+0 { ForceFullCompositionPipeline = On }"

Чтобы сделать это автоматически, проще всего поместить его в .bashrc. Чтобы продолжить, просто введите это в терминале:

$ echo "$ nvidia-settings --assign CurrentMetaMode=\"nvidia-auto-select +0+0 { ForceFullCompositionPipeline = On }\"" >> ~/.bashrc

Вы можете выйти из системы и снова войти (или перезагрузиться ), чтобы применить это. Обратите внимание, что это решение предназначено только для одного монитора из-за «автоматического выбора -».

Другой метод заключается в том, чтобы сделать то же самое внутри ~/.nvidia-settings-rc, но поведение может меняться со временем, в то время как в .bashrcвы уверены в том, как это делается.

Приложение

Что касается разрыва экрана, вы можете попробовать другие настройки.

Поскольку вы используете Manjaro, я предполагаю, что вы используете KDE. Вы можете указать оконному менеджеру (KWin )использовать тройную буферизацию или дождаться отображения текущего изображения перед обновлением экрана.

1 )Подождите, пока графический процессор полностью отобразит текущее изображение

# echo "export __GL_YIELD=\"USLEEP\"" >> /etc/profile.d/kwin.sh

2 )Включить тройную буферизацию в KWin

# echo "export KWIN_TRIPLE_BUFFER=1" >> /etc/profile.d/kwin.sh

Не включайте оба вышеперечисленных режима одновременно . Обязательно включите тройную буферизацию в nvidia-settings, если вы включаете тройную буферизацию в KWin.

2
23.04.2020, 10:49
5 ответов

Лично я бы просто убрал запятую после печати:

awk -F "/" 'BEGIN{ORS=","}/\/tcp/ {print $1}' | sed 's/,$//'

или, чтобы добавить завершающую новую строку:

awk -F "/" 'BEGIN{ORS=","}/\/tcp/ {print $1}' | sed 's/,$/\n/'

Если вы действительно хотите сделать это в awk, вы можете попробовать этот довольно неэлегантный подход:

awk -F "/" '/\/tcp/{ if(NR == 1){ printf "%s", $1} else{ printf ",%s",$1}}'

И, чтобы добавить завершающую новую строку:

awk -F "/" '/\/tcp/{ if(NR == 1){ printf "%s", $1} else{ printf ",%s",$1}}END{print ""}'
1
19.03.2021, 02:26

Не-awkответ, если предположить, что проблема настолько проста, как описано:

paste -s -d',' input_file

-s, --serialуказывает, что он будет обрабатывать файл (s )последовательно(pasteчасто используется для объединения строк из нескольких файлов)

-d, --delimitersопределяет разделитель (по умолчанию — TAB)

3
19.03.2021, 02:26

Не устанавливайте для ORS значение ,, потому что тогда вывод вашего скрипта не заканчивается новой строкой, и поэтому это недопустимый текстовый файл для POSIX и поэтому YMMV с тем, что другие скрипты, которые вы вызываете, делают с ним. Вместо этого оставьте ORS в покое, чтобы он сохранил любое значение, которое он должен иметь для вашей платформы, и печатайте ,ПЕРЕД каждой строкой, которую вы хотите вывести, кроме первой:

awk -F '/' '/\/tcp/{printf "%s%s", sep, $1; sep=","} END{print ""}'

например:

$ seq 3 | awk '{printf "%s%s", sep, $0; sep=","} END{print ""}'
1,2,3
4
19.03.2021, 02:26

ЕСЛИ вы используете это в оболочке (, которую вы не указали, или пометьте ), по крайней мере, bash и ksh справятся с этим легко:

 foo=$( awk -F/ '/\/tcp/{print $1}' )
 # command-substitution $(.. ) trims the last newline, or more exactly
 # it trims ALL trailing newline(s), so if there was an empty last line(s) 
 # (which the example in the Q doesn't) it is/they are also discarded

 printf %s "${foo//$'\n'/,}"   # change remaining=nonfinal newlines to commas
 # and DON'T add newline; if you want ending newline make the formatstring '%s\n'

$(.. )обрезка последней строки новой строки (s )и $'\n'для новой строки соответствуют POSIX; в древних оболочках вы можете использовать фактическую новую строку в кавычках. ${foo//old/new}замена только bash и ksh (не менее 93 ); в других оболочках за счет одного или двух дополнительных процессов, которые вы можете использовать

 printf %s "$foo" | tr '\n', 

Альтернативно, но менее эстетично, в любой оболочке POSIX вы можете использовать позиционные параметры:

( set -f; IFS=$'\n'; set -- $( awk -F/ '/\/tcp/{print $1}' ); IFS=,; printf %s "$*" )
# interpolating $(.. ) with IFS set and -f enabled
# breaks it at newlines (only) and doesn't glob, so $ 1..$# are now your lines
# using $* concatenates with IFS after each value except the last
# putting it in a subshell prevents -f IFS and args changes persisting;
# unneeded in a script or function that doesn't do anything affected subsequently

или только в bash (? )вы можете немного упростить с помощью

awk -F/ '/\/tcp/{print $1}' |( readarray -t x; IFS=,; printf %s "${x[*]}" )
0
19.03.2021, 02:26

Вы создаете единую выходную запись из данных, собранных по нескольким строкам. Итак, давайте сделаем это:

awk -F '/' '
    BEGIN { OFS = "," }
    /\/tcp/ { a[++n] = $1 }
    END {
        $0 = ""
        for (i = 1; i <= n; ++i)
            $i = a[i]
        print
    }' input_file

Собирает данные в массив a, а в блоке ENDстроит новую запись с полями из этого массива. В самом самом конце запись печатается. Поля будут разделены запятыми, так как мы устанавливаем OFSна запятую в блоке BEGIN.

Тестирование:

$ awk -F '/' 'BEGIN {OFS=","} /\/tcp/ {a[++n]=$1} END {$0="";for (i=1;i<=n;++i) $i = a[i];print}' <<END_INPUT
first/tcp
no relevant
second/tcp
third/tcp
END_INPUT
first,second,third

(Эта последняя строка выше является выходом, в то время как ввод предоставляется через здесь -документ, разделенный END_INPUT.)

0
19.03.2021, 02:26

Теги

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