awk / sed / и т. Д. Объединение столбцов в один файл

Многие Lenovos сделаны без аппаратного переключателя и имеют проблемы с списком rfkill , показывающим, что беспроводная сеть заблокирована. Обычное решение -

sudo -i
echo "blacklist ideapad-laptop" >> /etc/modprobe.d/blacklist.conf
exit
Перезагрузить
2
28.07.2016, 18:33
6 ответов
paste <(cut -f 1-8 file) <(cut -f9- file | tr -d '\t')
5
27.01.2020, 21:49

С помощью GNU sed (предполагая, что поля на входе разделены табуляцией):

sed 's/\t//9g'

Удаляет 9-й и последний символы табуляции в каждой строке.

Если во входных данных более 16 полей и вам не нужны лишние:

cut -f 1-16 | sed 's/\t//9g'
2
27.01.2020, 21:49

Ага, разными способами. Я протестировал следующие два файла в файле, созданном:

perl -le 'next if $.==1; for(1..20){print join "\t",1..20 }' > file

Это файл с 20 строками и 20 столбцами, разделенными табуляцией.

  1. Perl

     perl -F '\ t' -ale '$ "=" \ t "; print (скрытый) файл 
     

    Обратите внимание, что это объединяет все поля с 10-го по конец. Если вы хотите присоединить только 9 к 16, используйте вместо этого:

     perl -F '\ t' -ale '$ "=" \ t "; print (скрытый) @F [8..15], (скрытый) файл 
     
  2. awk

     awk -F '\ t' 'NR> 1 {
    for (i = 1; i <9; i ++) {
    printf "% s \ t", $ i 
    } 
    for (i = 9; i <= NF; i ++) {{ {1}} printf "% s", $ i 
    } print "" 
    } 'file 
     

    Как и раньше, это объединит все столбцы после 10-го. Если вы хотите присоединить только 9 к 16, используйте вместо этого:

     awk -F '\ t' 'NR> 1 {
    for (i = 1; i <9; i ++) {{{1 }} printf "% s \ t", $ i 
    } 
    for (i = 9; i <= 16; i ++) {
    printf "% s", $ i 
    } 
    для (i = 17; i <= NF; i ++) {
    printf "\ t% s", $ i 
    } {{1} } print "" 
    } 'file 
     

Конечно, решения awk не очень короткие, но, по крайней мере, вам не нужно указывать все поля рукой.

2
27.01.2020, 21:49

Альтернатива Python

$ cat file | python -c "import sys
for line in sys.stdin: l=line.rstrip('\r\n').split('\t'); print('\t'.join(l[:9]) + ''.join(l[9:]))
"

Альтернатива sed

s/(([^\t]*\t){8})/\1\n/
h
s/[^\n]*\n//
s/\t//g
G
s/([^\n]*)\n([^\n]*)\n.*/\2\1/

Пример использования:

$ sed -r "s/(([^\t]*\t){8})/\1\n/;h;s/[^\n]*\n//;s/\t//g;G;s/([^\n]*)\n([^\n]*)\n.*/\2\1/" file

Пояснение:

Предположим, что файл равен

a   b   c   d   e   f   g   h   i   j   k   l

Разделителем в файле является табуляция.

  1. sed читает текущую строку.

    • пространство шаблонов a b c d e f g h i j k l
  2. s / (([^ \ t] * \ t) {8}) / \ 1 \ n / разбивает строку на две части.

    • пространство шаблонов a b c d e f g h \ ni j k l
  3. h сохраняет пространство шаблонов в пространстве хранения.

    • пространство шаблонов abcdefgh \ ni jkl
    • пространство хранения abcdefgh \ ni jkl
  4. s / [^ \ n] * \ n // удаляет первую часть в шаблоне Космос.

    • пространство шаблонов i j k l
    • удерживаемое пространство a b c d e f g h \ ni j k l
  5. s / \ t // g удаляет табуляции в пространстве шаблонов.

    • пространство шаблонов ijkl
    • пространство хранения a b c d e f g h \ ni j k l
  6. G добавляет \ n и удерживает пространство к пространству шаблонов.

    • пространство шаблонов ijkl \ na bcdefgh \ ni jkl
    • пространство для хранения abcdefgh \ ni jkl
  7. s / ([^ \ n] *) \ n ([^ \ n] *) \ n. * / \ 2 \ 1 / разделяет пространство шаблонов и заменяет его второй и первой частями без \ n .

    • пространство шаблонов a b c d e f g h ijkl
    • удерживаемое пространство a b c d e f g h \ ni j k l
  8. sed печатает пространство шаблонов.

Можно изменить код и удалить вкладки в средних столбцах:

s/(([^\t]*\t){3})(([^\t]*\t){4})(.*)/\1\n\3\n\5/
h
s/[^\n]*\n([^\n]*)\n.*/\1/
s/\t//g
G
s/([^\n]*)\n([^\n]*)\n([^\n]*)\n(.*)/\2\1\4/
2
27.01.2020, 21:49

awk:

awk -v OFS="\t" '{for (i=10; i<=NF; i++) $9 = $9 " " $i; NF = 9; print}' file

Поля 10 в конце добавляются к полю 9, затем количество полей ограничивается первыми 9, и строка печатается с использованием табуляции в качестве разделителя полей вывода.

Я предполагаю, что вы хотите, чтобы объединенные поля были разделены пробелом.
Если нет, измените $ 9 "" $ i на $ 9 $ i

1
27.01.2020, 21:49

Предполагая, что несколько строк разделенных таблицей значений, сгенерированных таким образом:

% perl -E 'say join "\t", 1..8 for 1..3'

Затем различные столбцы могут обрабатываться по мере необходимости с помощью соответствующих флагов и переменных и функции доступны на Perl.

% perl -E 'say join "\t", 1..8 for 1..3' \
| perl -pale '$_=join "\t", @F[0..3], join "", @F[4..7] if $. > 1' 
1   2   3   4   5   6   7   8
1   2   3   4   5678
1   2   3   4   5678
% 
3
27.01.2020, 21:49

Теги

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