다음과 같이 csv 형식의 열을 가져올 수 있습니다.
,열 1,열 2,열 3,열 4,열 5,,
awk 명령을 사용하여 다음 형식으로 출력을 얻습니다.
awk -vORS=, '$0 && p {print $2}; $2 == "name" {p=1} '`
그런 다음 다음 두 명령을 사용하여 선행 및 후행 두 개의 쉼표를 제거했습니다.
cols=${cols:1}
cols=${cols:0:${#cols}-2}
이제 다음 형식으로 출력됩니다.
열 1, 열 2, 열 3, 열 4, 열 5
오른쪽 목록과 일치하는 특정 열을 제거하고 싶습니다. 예를 들어, "col4,col5" 매개변수를 사용하여 함수를 호출하면 awk는 마지막 두 열을 제거하고 다음과 같이 출력을 인쇄해야 합니다.
열 1, 열 2, 열 3
쉘 스크립트에서 이 작업을 어떻게 수행할 수 있습니까? (바람직하게는 awk 또는 grep 또는 해당 쉘에서 지원하는 다른 명령을 사용하여)?
업데이트: 초기 파일 내용은 다음과 같이 표 형식으로 출력됩니다.
+-----------------------------------------+--------+---------+
| name | type | comment |
+-----------------------------------------+--------+---------+
| col1 | int | |
| col2 | int | |
| col3 | string | |
| col4 | string | |
| col5 | string | |
+-----------------------------------------+--------+---------+
답변1
Cut을 사용하여 구분된 데이터에서 특정 열을 추출할 수 있습니다. 예를 들어 다음은 마지막 두 열을 추출합니다.
echo col1,col2,col3,col4,col5 | cut -d , -f 4,5
인쇄
col4,col5
-d 매개변수는 구분 기호를 지정하고 -f는 결과에 표시하려는 결과 필드의 색인 또는 색인 범위를 지정합니다.
편집하다
보다 동적으로 만들기 위해 아래에서는 Y 구분 기호를 기반으로 마지막 X 열을 선택합니다.
function lastCols {
endcol=$(($(head -n 1 $1 | grep -o , | wc -l) + 1))
startcol=$(($endcol-$2+1))
cut -d $3 -f $startcol-$endcol < $1
}
lastCols $1 $2 $3
이에 대해 많은 테스트를 수행하지 않았으므로 문제가 있을 수 있습니다. 다음과 같이 사용하세요:
[]$ cat temp.txt
col1,col2,col3,col4,col5
col1,col2,col3,col4,col5
col1,col2,col3,col4,col5
col1,col2,col3,col4,col5
col1,col2,col3,col4,col5
col1,col2,col3,col4,col5
col1,col2,col3,col4,col5
col1,col2,col3,col4,col5
col1,col2,col3,col4,col5
[]$ ./lastCols.sh temp.txt 2 ,
col4,col5
col4,col5
col4,col5
col4,col5
col4,col5
col4,col5
col4,col5
col4,col5
col4,col5
답변2
이것은 제가 몇 년 전 정기적으로 OpenStack 작업을 하다가 OpenStack 도구의 구문 분석하기 어려운 출력에 짜증이 났을 때 이 문제에 대한 응답으로 쓴 글입니다.
#! /usr/bin/perl
# untable.pl
#
# Copyright (C) 2012, 2013 Craig Sanders <[email protected]>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
# script to strip mysql-style table formatting from nova, keystone,
# glance, etc commands
#
# also works for any tables output from mysql, and from tables produced
# by 'links -dump'
#
# makes the output easily parsable and usable in other scripts.
#
# TODO: command-line option to allow forcing of output style (2-column
# or multi-column) rather than detection.
use strict;
use Carp;
use Getopt::Long;
my $print_headers=0;
my $separator = '';
my $tab = '';
my $result = GetOptions("headers!" => \$print_headers,
"separator=s" => \$separator,
"tab" => \$tab,
);
$separator = "\t" if ($tab);
my $propval = -1;
our @headers;
while(<>) {
chomp;
next if (m/^\+/);
s/^\|\s*|\s*\|$//iog; # this / is here to fix SE''s broken perl syntax highlighting.
my @columns = split '\|';
# strip leading and trailing spaces
for my $col (0..scalar @columns-1) {
if ($columns[$col] eq '') {;
delete $columns[$col];
} else {
$columns[$col] =~ s/^\s+|\s+$//iog;
};
}
# find type of table - 2-column Property/Value, or multi-column
if ($propval == -1) {
if ($columns[0] eq 'Property') {
$propval = 1 ;
$separator = ": " if ($separator eq ''); # default to ': ' unless specified on cmd line
} else {
$propval = 0;
$separator = "\t" if ($separator eq ''); # default to TAB unless specified on cmd line
@headers = @columns;
print (join($separator,@headers),"\n") if $print_headers ;
};
next;
} else {
print join($separator,@columns),"\n" if (defined $columns[1]); # skip line unless we have more than one column to output
}
}
예:
두 개의 열:
$ keystone tenant-get 93c14424ed06494c832457d974b9505e
+-------------+-----------------------------------------+
| Property | Value |
+-------------+-----------------------------------------+
| description | Anonymous Tenant Description |
| enabled | True |
| id | 93c14424ed06494c832457d974b9505e |
| name | ANON1 |
+-------------+-----------------------------------------+
$ keystone tenant-get 93c14424ed06494c832457d974b9505e | ./untable.pl
description: Anonymous Tenant Description
enabled: True
id: 93c14424ed06494c832457d974b9505e
name: ANON1
여러 열:
$ keystone user-list 810
+-----+---------+-----------------------------+-----------------------------+
| id | enabled | email | name |
+-----+---------+-----------------------------+-----------------------------+
| 414 | 1 | [email protected] | [email protected] |
| 500 | 1 | [email protected] | [email protected] |
| 610 | 1 | [email protected] | [email protected] |
| 729 | 1 | [email protected] | [email protected] |
+-----+---------+-----------------------------+-----------------------------+
$ keystone user-list 810 | ./untable.pl
414 1 [email protected] [email protected]
500 1 [email protected] [email protected]
610 1 [email protected] [email protected]
729 1 [email protected] [email protected]