Как распечатать содержимое полей столбцов, содержащих строки, состоящие из символа " n " / s, с помощью bash?

Как распечатать содержимое полей столбцов, содержащих строки, состоящие из символа " n " / s, с помощью bash?

17.01.2020 09:48:46 Просмотров 31 Источник

Скажем, у меня есть файл, который содержит:

22  30  31  3a  31  32  3a  32          " 0 9 : 1 2 : 2
30  32  30  20  32  32  3a  31          1 2 7   2 2 : 1

Кроме того, я хочу печатать только те поля столбцов, в которых строка состоит из 1 символа. Я хочу, чтобы результат был таким:

" 0 9 : 1 2 : 2
1 2 7   2 2 : 1

Затем я хочу печатать только те строки, которые состоят из двух символов, вывод должен быть:

22  30  31  3a  31  32  3a  32
30  32  30  20  32  32  3a  31 

Я новичок, и я действительно не знаю, как это сделать. Спасибо за вашу помощь!

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/59782435/how-to-print-contents-of-column-fields-that-have-strings-composed-of-n-charact#comment105708446_59782435
Эти столбцы разделены табуляцией?
https://stackoverflow.com/questions/59782435/how-to-print-contents-of-column-fields-that-have-strings-composed-of-n-charact#comment105708506_59782435
@Shawn пробел и таб сэр
https://stackoverflow.com/questions/59782435/how-to-print-contents-of-column-fields-that-have-strings-composed-of-n-charact#comment105708526_59782435
Пробел и табуляция? Это делает колонку с тем, что кажется пространством во второй строке, довольно трудной для размещения...
https://stackoverflow.com/questions/59782435/how-to-print-contents-of-column-fields-that-have-strings-composed-of-n-charact#comment105708552_59782435
@RavinderSingh13 я честно не понимаю, что вы имеете в виду, сэр.. извиняюсь.. В чем проблема наличия "в первом ряду"? пожалуйста, просветите меня, сэр..
https://stackoverflow.com/questions/59782435/how-to-print-contents-of-column-fields-that-have-strings-composed-of-n-charact#comment105708566_59782435
@LiPo, я имел в виду, какова логика их разделения, я видел ваши предыдущие комментарии по этому поводу, никаких проблем.

Ответы - Как распечатать содержимое полей столбцов, содержащих строки, состоящие из символа " n " / s, с помощью bash? / How to print contents of column fields that have strings composed of "n" character/s using bash?

dibery

17.01.2020 09:55:36

Вы можете попробовать

awk '{for(i=1;i<=NF;++i)if(length($i)==1)printf("%s ", $i);print("")}'

Для каждого поля проверьте длину и распечатайте его, если это необходимо. Вы можете передать опцию-Fв awk, если она не разделена пробелами.

Сценарий awkрасширяется следующим образом::

for( i = 1; i <= NF; ++i )
  if( length( $i ) == 1 )
    printf( "%s ", $i );
print( "" );

Внешний цикл печати предназначен для печати новой строки после каждой входной строки.

https://stackoverflow.com/questions/59782435/how-to-print-contents-of-column-fields-that-have-strings-composed-of-n-charact/59782505#comment105708655_59782505
Вау, большое спасибо за это сэр @dibery ! Это сработало!
https://stackoverflow.com/questions/59782435/how-to-print-contents-of-column-fields-that-have-strings-composed-of-n-charact/59782505#comment105709035_59782505
Хотя ответ принят ОП, я боюсь, что он не дает ожидаемого результата ОП. Столбцы после "пробела" сдвигаются влево во 2-й строке. Файл выглядит как список дампов (шестнадцатеричные значения в левой половине и символы ascii в правой половине), то лучше разбить их на позиции столбцов, а не на критерии длины символов.
https://stackoverflow.com/questions/59782435/how-to-print-contents-of-column-fields-that-have-strings-composed-of-n-charact/59782505#comment105709470_59782505
@tshiono вы на самом деле правы, сэр. Но в моем случае мне все равно, если он автоматически переместится влево. Пока он печатает нужные мне строки.
https://stackoverflow.com/questions/59782435/how-to-print-contents-of-column-fields-that-have-strings-composed-of-n-charact/59782505#comment105709528_59782505
@RavinderSingh13 но, должен признать, ваш ответ был лучше, сэр. Спасибо!
Shawn

17.01.2020 10:01:57

Предполагая, что все столбцы разделены табуляцией (таким образом, вы можете иметь пробел в качестве значения столбца, как вторая строка вашего образца), легко сделать с однострочным perl:

$ perl -F"\t" -lane 'BEGIN { $, = "\t" } print grep { /^.$/ } @F' foo.txt
"       0       9       :       1       2       :       2
1       2       7               2       2       :       1
$ perl -F"\t" -lane 'BEGIN { $, = "\t" } print grep { /^..$/ } @F' foo.txt
22      30      31      3a      31      32      3a      32
30      32      30      20      32      32      3a      31
https://stackoverflow.com/questions/59782435/how-to-print-contents-of-column-fields-that-have-strings-composed-of-n-charact/59782569#comment105709008_59782569
Это не сработало для отделенной от пространства секции. Но, это сработало на тех разделенных вкладках. Спасибо, сэр @Shawn!
Является ответом!
RavinderSingh13

17.01.2020 10:25:17

Не могли бы вы попробовать следовать, я пытаюсь это по-другому для предоставленных образцов. Написано и проверено только с предоставленными образцами.

Для получения значений до объемного пространства попробуйте:

awk '
{
  line=$0
  while(match($0,/[[:space:]]+/)){
    arr=arr>RLENGTH?arr:RLENGTH
    start[arr]+=RSTART+prev_start
    prev_start=RSTART
    $0=substr($0,RSTART+RLENGTH)
  }
  var=substr(line,1,start[arr]-1)
  sub(/ +$/,"",var)
  print var
  delete start
  var=arr=""
}
'  Input_file

Выход будет следующим.

22  30  31  3a  31  32  3a  32
30  32  30  20  32  32  3a  31


Для получения значений после объемного пространства попробуйте:

awk '
{
  line=$0
  while(match($0,/[[:space:]]+/)){
    arr=arr>RLENGTH?arr:RLENGTH
    start[arr]+=RSTART+prev_start
    prev_start=RSTART
    $0=substr($0,RSTART+RLENGTH)
  }
  var=substr(line,start[arr])
  sub(/^ +/,"",var)
  print var
  delete start
  var=arr=""
}
'  Input_file

Выход будет следующим:

" 0 9 : 1 2 : 2
1 2 7   2 2 : 1
https://stackoverflow.com/questions/59782435/how-to-print-contents-of-column-fields-that-have-strings-composed-of-n-charact/59782856#comment105709331_59782856
Первым выводом awk были те строки, которые состоят из двух символов. В то время как второй вывод awk был тем, что только состоит из одного символа. Спасибо сэр @RavinderSingh13 это тоже сработало!
https://stackoverflow.com/questions/59782435/how-to-print-contents-of-column-fields-that-have-strings-composed-of-n-charact/59782856#comment105709384_59782856
@LiPo, Извините, что была опечатка:) код работает нормально, дайте мне знать, это должно быть гибкое решение IMHO для предоставленных образцов, Дайте мне знать о том же.
https://stackoverflow.com/questions/59782435/how-to-print-contents-of-column-fields-that-have-strings-composed-of-n-charact/59782856#comment105709479_59782856
Ответ велик в том смысле, что он надежен для длины пробела между левой половиной и правой. Если бы я был ОП, я бы переключился, чтобы принять этот ответ.
https://stackoverflow.com/questions/59782435/how-to-print-contents-of-column-fields-that-have-strings-composed-of-n-charact/59782856#comment105709497_59782856
@tshiono, Спасибо за ваши взгляды приятель, ура :)
https://stackoverflow.com/questions/59782435/how-to-print-contents-of-column-fields-that-have-strings-composed-of-n-charact/59782856#comment105709576_59782856
Да я уже переключился на этот ответ. Спасибо за все ваши усилия :)
Закрыть X