Perl 如何将数据解析为CSV文件中的唯一列
因此,我有一个包含数千列的csv文件。例如,假设第一列作为服务器名称,其余列作为打开的端口 例如: 我正试图通过任何命令行工具找到一种方法,将其处理为独特的列,从而使上述内容成为:Perl 如何将数据解析为CSV文件中的唯一列,perl,csv,awk,Perl,Csv,Awk,因此,我有一个包含数千列的csv文件。例如,假设第一列作为服务器名称,其余列作为打开的端口 例如: 我正试图通过任何命令行工具找到一种方法,将其处理为独特的列,从而使上述内容成为: SERVER1,22,25,110,3389,,etc SERVER2,22,,110,3389,45001,etc SERVER3,,,,3389,45001,etc 欢迎提出任何意见。谢谢 你可以试试这个awk awk -F, ' NR==FNR{ for(i=2;i<=NF;i++) a[$i]
SERVER1,22,25,110,3389,,etc
SERVER2,22,,110,3389,45001,etc
SERVER3,,,,3389,45001,etc
欢迎提出任何意见。谢谢 你可以试试这个awk
awk -F, '
NR==FNR{
for(i=2;i<=NF;i++)
a[$i];
next
}
{
i=2;
b=$1;
for(j in a)
{
if($i == j)
{
b=b FS $i;
i++
}
else
b=b FS
}
print b
}
' infile infile
awk-F,'
NR==FNR{
对于(i=2;i你可以试试这个awk
awk -F, '
NR==FNR{
for(i=2;i<=NF;i++)
a[$i];
next
}
{
i=2;
b=$1;
for(j in a)
{
if($i == j)
{
b=b FS $i;
i++
}
else
b=b FS
}
print b
}
' infile infile
awk-F,'
NR==FNR{
对于(i=2;iperl
不要担心“etc”首先出现:端口按数字排序,字符串“etc”被视为数字零。perl
不要担心“etc”首先出现:端口按数字排序,字符串“etc”被视为数字零。GNU awk用于排序的输入:
$ cat tst.awk
BEGIN {
FS=OFS=","
PROCINFO["sorted_in"] = "@ind_num_asc"
}
NR==FNR {
for (i=2; i<=NF; i++) {
allVals[$i]
}
next
}
{
delete curVals
for (i=1; i<=NF; i++) {
curVals[$i]
}
printf "%s", $1
for (i in allVals) {
printf "%s%s", OFS, (i in curVals ? i : "")
}
print ""
}
$ awk -f tst.awk file file
SERVER1,etc,22,25,110,3389,
SERVER2,etc,22,,110,3389,45001
SERVER3,etc,,,,3389,45001
$cat tst.awk
开始{
FS=OFS=“,”
PROCINFO[“排序在”]=“@ind\u num\u asc”
}
NR==FNR{
对于(i=2;i,GNU awk用于排序的_in:
$ cat tst.awk
BEGIN {
FS=OFS=","
PROCINFO["sorted_in"] = "@ind_num_asc"
}
NR==FNR {
for (i=2; i<=NF; i++) {
allVals[$i]
}
next
}
{
delete curVals
for (i=1; i<=NF; i++) {
curVals[$i]
}
printf "%s", $1
for (i in allVals) {
printf "%s%s", OFS, (i in curVals ? i : "")
}
print ""
}
$ awk -f tst.awk file file
SERVER1,etc,22,25,110,3389,
SERVER2,etc,22,,110,3389,45001
SERVER3,etc,,,,3389,45001
$cat tst.awk
开始{
FS=OFS=“,”
PROCINFO[“排序在”]=“@ind\u num\u asc”
}
NR==FNR{
对于(i=2;我认为这一逻辑有问题,因为当$i==j
时,你只会增加i
,所以它不一定会测试所有字段。试试看……给定的数据没有问题,因为端口号是按顺序排列的。如果一行看起来像SERVER2,22785110338945001,那么你是对的,它是错的。我认为是这样的e在这个逻辑中有点错误,因为当$i==j
时,你只会增加i
,所以它不一定会测试所有字段。试试看……给定的数据没有问题,因为端口号是按顺序排列的。如果一行看起来像SERVER2,227885110338945001,那么你是对的,它是错的。你试过什么代码远?到目前为止你试过什么代码?
$ cat tst.awk
BEGIN {
FS=OFS=","
PROCINFO["sorted_in"] = "@ind_num_asc"
}
NR==FNR {
for (i=2; i<=NF; i++) {
allVals[$i]
}
next
}
{
delete curVals
for (i=1; i<=NF; i++) {
curVals[$i]
}
printf "%s", $1
for (i in allVals) {
printf "%s%s", OFS, (i in curVals ? i : "")
}
print ""
}
$ awk -f tst.awk file file
SERVER1,etc,22,25,110,3389,
SERVER2,etc,22,,110,3389,45001
SERVER3,etc,,,,3389,45001