2016-07-04 2 views
1

У меня есть файл, который имеет много строк, но каждая строка имеет короткую длину.Как печатать один файл в формате нескольких столбцов в bash?

Как распечатать этот файл в формате нескольких столбцов в bash?

Этот файл, как показано ниже:

This is the first line haha. 
second line 
third line 

first line of second paragraph 
hahahahahaha 
yayayayayaya 

This is the third paragraph. 
3-1. random random random 
3-2. random random 
3-3. random random random 
3-4. random random random random 
3-5. random random random 
3-6. random 
3-7. random random random 
3-8. random random 
3-9. random random 
3-10. random 
3-11. random random random 
3-12. random random 
3-13. random 

This is the fourth paragraph. 
4-1. random random random 
4-2. random random 
4-3. random random random 
4-4. random random random random 
4-5. random random random 
4-6. random 
4-7. random random random 
4-8. random random 
4-9. random random 
4-10. random 
4-11. random random random 
4-12. random random 
4-13. random 

Как вы можете видеть, ширина каждой линии непродолжителен.

И я хочу, чтобы распечатать файл в формате ниже:

$> cat sample.txt -n 3 
This is the first line haha.  This is the third paragraph.  This is the fourth paragraph. 
second line      3-1. random random random   4-1. random random random 
third line      3-2. random random     4-2. random random 
            3-3. random random random   4-3. random random random 
first line of second paragraph 3-4. random random random random 4-4. random random random random 
hahahahahaha      3-5. random random random   4-5. random random random 
yayayayayaya      3-6. random       4-6. random 
            3-7. random random random   4-7. random random random 
            3-8. random random     4-8. random random 
            3-9. random random     4-9. random random 
            3-10. random      4-10. random 
            3-11. random random random   4-11. random random random 
            3-12. random random     4-12. random random 
            3-13. random      4-13. random 
+2

Для каждого вопроса о реорганизации данных я хотел бы рекомендовать более мощный язык скриптов, такой как perl или python, а не скрипт bash. Чтение данных в хэш-таблицу и вывод их в любом формате, как вам нравится, будет более красивой реализацией, чем bash. – gzh

+2

Я хочу найти решение bash, чтобы потом использовать его без установки чего-либо или вытащить какой-либо код. –

+0

Каковы требования для получения результата? Как вы определяете, сколько строк содержит каждый столбец? – 123

ответ

0

Использование pr может решить эту проблему.

$> pr -t -3 -w 120 sample.txt | expand 
This is the first line haha.   3-5. random random random    4-3. random random random 
second line        3-6. random        4-4. random random random random 
third line        3-7. random random random    4-5. random random random 
             3-8. random random      4-6. random 
first line of second paragraph   3-9. random random      4-7. random random random 
hahahahahaha       3-10. random       4-8. random random 
yayayayayaya       3-11. random random random    4-9. random random 
             3-12. random random      4-10. random 
This is the third paragraph.   3-13. random       4-11. random random random 
3-1. random random random              4-12. random random 
3-2. random random      This is the fourth paragraph.   4-13. random 
3-3. random random random    4-1. random random random 
3-4. random random random random  4-2. random random 

Аргументы Объяснение:

  • pr -3: три колонки

  • pr -t: нет головы и хвоста баннер

  • pr -w 120: длина линии 120 голец

  • expand: заменить вкладки в пространствах

Если вы хотите другое направление, вы можете использовать -l 1.

$> pr -l 1 -t -3 -i -w 120 sample.txt | expand 
This is the first line haha.   second line        third line 
             first line of second paragraph   hahahahahaha 
yayayayayaya                 This is the third paragraph. 
3-1. random random random    3-2. random random      3-3. random random random 
3-4. random random random random  3-5. random random random    3-6. random 
3-7. random random random    3-8. random random      3-9. random random 
3-10. random       3-11. random random random    3-12. random random 
3-13. random                 This is the fourth paragraph. 
4-1. random random random    4-2. random random      4-3. random random random 
4-4. random random random random  4-5. random random random    4-6. random 
4-7. random random random    4-8. random random      4-9. random random 
4-10. random       4-11. random random random    4-12. random random 
4-13. random 
1

Этот скрипт будет работать. Он делает:

  1. Определить самую длинную линию и самый длинный пункт

  2. Помещенный каждый пункт в одном файле и добавить пробелы в каждой строке, так что будет содержать столько символов, как самой длинной строки.

  3. Добавить новые строки в файлы, пока они не будут иметь одинаковую длину.

  4. Используйте tr, чтобы распечатать их рядом.

Это Баш только сценарий:

#!/bin/bash 
#get input file name 
input="$1" 
#count paragraphs starting at 1 
paraNr=1 
#what is the longest line in the file 
longestLine=$(($(cat "$input" | wc -L) + 1)) 
paraFile=$(tempfile) 
maxLength=0 
currentLength=0 
while read -r line; 
do 
    if [ -z "$line" ] 
    then 
    paraNr=$((paraNr+1)) 
    if [[ "$currentLength" -gt "$maxLength" ]] 
    then 
     #determine longest paragraph to later put in empty lines in shorter paragaphs 
     maxLength=$currentLength 
     currentLength=0 
    fi 
    else 
    length=${#line} 
    paddLength=$(($longestLine-$length)) 
    padding=$(printf ' %.0s' $(seq 1 "$paddLength")) 
    echo "$line$padding" >> $paraFile.$paraNr 
    currentLength=$((currentLength+1)) 
    fi  
done < "$input" 

files="" 
#maxLength=0 
for i in $(seq 1 $paraNr) 
do 
    current=$(cat "$paraFile"."$i" | wc -l) 
    add=$(($maxLength-$current)) 
    for x in $(seq 0 $add) 
    do 
    padding=$(printf ' %.0s' $(seq 1 "$longestLine")) 
    echo "$padding" >> $paraFile.$i 
    done 
    files="$files $paraFile.$i" 
done 

pr -t -J -m -S"" $files 

С вашего входного файла, он будет выводить это:

./s.sh input.txt 
This is the first line haha.  first line of second paragraph This is the third paragraph.  This is the fourth paragraph. 
second line      hahahahahaha      3-1. random random random  4-1. random random random 
third line      yayayayayaya      3-2. random random    4-2. random random 
                    3-3. random random random  4-3. random random random 
                    3-4. random random random random 4-4. random random random random 
                    3-5. random random random  4-5. random random random 
                    3-6. random      4-6. random 
                    3-7. random random random  4-7. random random random 
                    3-8. random random    4-8. random random 
                    3-9. random random    4-9. random random 
                    3-10. random      4-10. random 
                    3-11. random random random  4-11. random random random 
                    3-12. random random    4-12. random random 
                    3-13. random      4-13. random 
Смежные вопросы