Показуйте порожні рядки за допомогою команди cat


11

У мене нижче список файлів.txt:

-rw-rw-r-- 1 root dev 11 May 16 12:18 20_SumActive.txt  
-rw-rw-r-- 1 root dev 11 May 16 12:18 22_SumActive.txt  
-rw-rw-r-- 1 root dev  7 May 16 12:18 24_SumActive.txt  
-rw-rw-r-- 1 root dev  0 May 16 12:18 26_SumActive.txt  
-rw-rw-r-- 1 root dev  0 May 16 12:18 28_SumActive.txt  

Вихід:

kpgmeddev01> cat 2[0-8]_SumActive.txt   
Sum: 47760  
Sum: 72000  
Sum: 0

Як отримати вихід, як показано нижче:

Sum: 47760  
Sum: 72000  
Sum: 0  
[Blank]  
[Blank]  

Потрібні вказівки.


Чи містять файли більше одного рядка?
roaima

Ні, лише 1 рядок
Fewong

1
Ага, коли ви писали [Blank], ви мали на увазі ці 7 символів чи мали намір вказати порожній рядок?
roaima

1
Не використовуючи кота. Не обмежуйте себе.
ctrl-alt-delor

Відповіді:


20

catне може вивести дані, які не існують у файлах. Якщо файл порожній, він навіть не має символу нового рядка, щоб надати порожній рядок як вихід.

Ви можете переконатися, що файли містять принаймні один символ нового рядка.

Ось як ви використовуєте GNU awkдля того, щоб (це змінює порожні файли):

awk 'ENDFILE { if (FNR == 0) printf("\n") >>FILENAME }' 2[0-8]_SumActive.txt   

ENDFILEБлок буде виконаний після закінчення зчитування будь-якого з файлів. Якщо FNRнуль, ми ніколи не бачили жодних рядків у файлі, тому ми вставляємо в нього один новий рядок. Потім сценарій продовжується наступним файлом.

Потім ви можете використовувати так, catяк ви робили у питанні.


Крім того, не змінюючи файли, використовуючи GNU awk замість cat :

awk 'ENDFILE { if (FNR == 0) printf("\n") } 1' 2[0-8]_SumActive.txt

Це робить такий самий вид виявлення порожніх файлів, як вище, але друкує новий рядок до стандартного виводу, а не до файлу. В 1кінці може бути замінено { print }і призведе до виведення всіх даних у непорожніх файлах.


Крім того, цикл оболонки (повинен працювати в будь-якій оболонці POSIX):

for name in ./2[0-8]_SumActive.txt; do
    if [ -s "$name" ]; then
        cat "$name"
    else
        printf '\n'
    fi
done

-sТест буде істиною , якщо файл існує і має більший розмір , ніж нуль.


Якщо ви хочете, щоб буквальна рядок [Blank]виводилася для порожніх файлів, просто вставте цю рядок перед \nвикликами printfвище (це також буде працювати в awkкоді).


2
@Fewong Добре! Якщо це вирішує ваше питання, будь ласка, подумайте про прийняття відповіді .
Кусалаланда

@Fewong: Або прийміть іншу відповідь, яка допоможе вам ще краще - це хороша практика давати шанс кожному часовому поясу, тому поспішати не потрібно.
MSalters

@Fewong Однозначно не поспішати. Стефане також написав коротке та компактне рішення, яке виглядає перспективно.
Кусалаланда

@Kusalananda, дякую, і я перевірив, що це спрацювало.
Fewong

16

З perl

perl -0777 -pe 's/\n?\z/\n/' 2[0-8]_SumActive.txt

Що додає символ нового рядка, якщо його не вистачає в кінці, таким чином виводиться порожній рядок для порожніх файлів, але також додається новий рядок для непорожніх файлів, які пропускають файли (і в кінцевому підсумку з’єднуються в одному рядку з cat).


приємна пропозиція
erTugRul

13

(Це не зовсім те, про що ви запитуєте, але :) У таких ситуаціях я вважаю за краще використовувати head

$ head -z 2[0-8]_SumActive.txt
==> 21_SumActive.txt <==
Sum: 47760  
Sum: 72000  
Sum: 0  

==> 22_SumActive.txt <==

==> 25_SumActive.txt <==

==> 28_SumActive.txt <==

Зазвичай це те, що ви хочете. Якщо ні, sedто згодом це легко


12

З xargsі grepви можете спробувати щось на кшталт:

$>ls | xargs -n1 sh -c 'grep "" $0 || echo "[Blank]"'
Sum: 47760
Sum: 72000
Sum: 0
[Blank]
[Blank]

4
Можливо, не найшвидше рішення (розгалуження оболонки для кожного файлу), але лише одне на даний момент, яке насправді буде працювати, якщо у вас є мільйони таких файлів у поточному каталозі (не використовуючи розширення оболонок та натискаючи межа ARGV).
Матія Наліс

1
@MatijaNalis: Дуже правда! Але вам би не було байдуже 5 файлів.
FloHimself

6

Якщо припустити, що [Blank]ви маєте на увазі буквальні порожні рядки, це повинно працювати:

paste -s 2[0-8]_SumActive.txt

6

Ви можете протестувати кожен файл, щоб побачити, чи немає нульової довжини, перш ніж намагатися відобразити його вміст:

for f in 2[0-8]_SumActive.txt;
do
    [[ -s "$f" ]] && awk 1 "$f" || echo '[Blank]'
done

Я використовував awk 1 "$f"замість цього, cat "$f"тому що awkгарантує закінчення виводу файлу новим рядком.

У вашому запитанні, якщо ви задумали, що це [blank]має бути не буквальний, а лише порожній рядок, ви можете реалізувати це за допомогою наведеного вище коду та видаливши '[Blank]'з кінця echoвисловлювання.


5

Я припускаю, що ваші файли 26_SumActive.txt і 28_SumActive.txt порожні, і вам потрібні порожні рядки під час відображення їх вмісту

Для цього ви можете просто повторити список файлів і передати їх вміст, і якщо файл порожній, відлунюйте порожній рядок.

[ -s FILE ] Вірно, якщо FILE існує і має розмір більше нуля.

$ for i in $(ls 2[0-8]_SumActive.txt) ; do  cat $i;  if [ ! -s $i ]; then echo -e ""; fi; done
Sum: 47760  
Sum: 72000  
Sum: 0  
[ Blank Line]
[ Blank Line ]

1
Або if [ -s $i ]; then cat $i; else echo -e ""; fi;. Ще +1 для простого тесту з використанням лише стандартних функцій оболонки.
MSalters

2
Або просто cat "$i"; test -s "$i" || echo- немає необхідності в цих незграбних ifчи не портативних echoпрапорах.
Toby Speight

1
cat 2[0-8]_SumActive.txt -

де - дозволить коту читати зі стандартного вводу.

Отже, після відображення вмісту ваших файлів кішка буде чекати вашого введення. Ви можете зробити бажаний ввід, натиснувши клавішу Enter для буквальних пробілів або [Blank], якщо це те, що ви хочете. Після кожного введення вводу натисніть кнопку ^ D (Ctrl + D) після завершення вводу, і ви закінчите.

PS: За кожен вхід ви отримаєте відповідний вихід.

cat 2[0-8]_SumActive.txt - 4[0-8]_SumActive.txt

За допомогою цього ви зможете розмістити пробіли або щось інше, що вам потрібно, між двома послідовними вихідними.


Виходячи з цього, ви можете просто запропонувати catяк рішення і дозволити ОП вашим тим, що вони хочуть.
roaima
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.