Как напечатать содержимое полей столбцов, в которых есть строки, состоящие из символов "n", используя bash? - PullRequest
0 голосов
/ 17 января 2020

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

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 

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

Ответы [ 3 ]

4 голосов
/ 17 января 2020

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

Для получения значений перед BULK SPACE попробуйте:

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


Для получения значений после BULK SPACE попробуйте:

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
1 голос
/ 17 января 2020

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

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( "" );

print вне l oop - печатать новую строку после каждой строки ввода.

0 голосов
/ 17 января 2020

Предполагая, что все столбцы разделены табуляцией (таким образом, вы можете иметь пробел в качестве значения столбца, как вторая строка вашего образца), это легко сделать с помощью однострочного 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
...