Сокращение и транспонирует некоторые строки файла

Для интерактивного представления CLI о Linux я рекомендовал бы dstat.

2
02.01.2014, 01:13
5 ответов

Они должны работать:

awk '{if(n==41){n=0;print $0}else{printf "%s ",$0;n++}}' data.txt 

или

awk '{if(NR % 42 == 0){print;}else{printf "%s ",$0}}' data.txt

или

perl -ne 'if($. % 42){chomp; print "$_ "}else{ print;}' data.txt 

или

perl -pne 's/\n/ / if $. % 42' data.txt
3
27.01.2020, 21:51
  • 1
    @Abraham на самом деле, была ошибка в исходной версии, которая заставит Вас пропускать некоторые строки. Используйте обновленную версию. –  terdon♦ 02.01.2014, 04:46

Самый легкий путь состоит в том, чтобы использовать rs команда - если это доступно:

cat original.file | rs 32 42 > reshaped.file
2
27.01.2020, 21:51

Как насчет этого:

COUNT=0
while read data
do
  echo -n "${data} "
  let COUNT=${COUNT}+1;
  if (( ${COUNT} % 42  == 0 ))
  then
    echo ""
  fi
done < data.txt
1
27.01.2020, 21:51

Используя вставку

Только потому, что я люблю использовать paste так, можно на самом деле сделать это с paste, хотя это не симпатично:

Демонстрационные данные

$ seq 100 > data.txt

Пример

$ paste -d " " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - < data.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100     

Если необходимо управлять числом столбцов, то добавьте/удалите соответствующую сумму тире от paste.

Можно стать необычными и использовать цикл для управления поколением тире к paste как так:

$ paste -d " " $(for i in $(seq 42); do echo "- ";done) < data.txt 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100    

Дальнейшие улучшения могут быть сделаны к циклу. Вместо использования seq мы можем использовать расширение фигурной скобки оболочек {#...#}.

$ paste -d " " $(for i in {1..42}; do echo "- ";done) < data.txt

Используя xargs

Другой менее очевидный метод должен был бы сделать xargs сделайте управление количества символов через -n # переключатель.

$ seq 100 | xargs -n 42
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

Таким образом, мы могли усилить этот метод как так:

$ xargs -n 42 < data.txt 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100

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

1
27.01.2020, 21:51
  • 1
    xargs каждый является блестящим! –  terdon♦ 02.01.2014, 04:23
  • 2
    @terdon - спасибо, этими вопросами всегда является забава, так как мы можем выяснить как можно больше путей, чтобы сделать X. Я собирался сделать это Perl, но видел Вас избитый меня к нему так, я полагал, что пробую другие пути. –  slm♦ 02.01.2014, 04:33

Если Вы могли бы использовать Python, numpy вполне хорошо подходит для этого. Принятие файла x.txt содержит данные, Вы могли сделать что-то как:

#!/usr/bin/env python
import numpy as np

a=np.loadtxt('x.txt', dtype='int') # load array from file x.txt into variable a
print a
b=a.reshape(32,42) # reshape array to desired shape
print b
c=a.T # Do a transpose if required
print c
1
27.01.2020, 21:51

Теги

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