如何获得以下输出?

时间:2015-03-18 07:43:22

标签: perl

我有一个看起来像这样的文件

#define PIOMUX2_UART_3_RXD   CONFIG_PIO31_5_SELECTOR,   ALT_2,   CONFIG_SYSCFG_PIO31_5_OE,   I
#define PIOMUX2_UART_3_TXD   CONFIG_PIO31_6_SELECTOR,   ALT_2,   CONFIG_SYSCFG_PIO31_6_OE,   O
#define PIOMUX2_UART_3_CTS   CONFIG_PIO31_7_SELECTOR,   ALT_1,   CONFIG_SYSCFG_PIO31_7_OE,   I

我需要得到像

#define PIOMUX2_UART_3_RXD   CONFIG_PIO31_5_SELECTOR
#define PIOMUX2_UART_3_TXD   CONFIG_PIO31_6_SELECTOR
#define PIOMUX2_UART_3_CTS   CONFIG_PIO31_7_SELECTOR

我试过这个:

open my $fh, '>', 'perl_script_3_out_1.txt' or die $!;
while (<$fh>)
{
  s/^ALT//g;
  s/^CONFIG_SYS//g;
  s/,//g; print $_;
}
close($fh);

5 个答案:

答案 0 :(得分:2)

您的主要问题是您正在以写入模式('>')打开文件,但之后尝试从中读取文件(<$fh>。)

你的第二个问题是你将替换正则表达式锚定到行的开头(s/^...),但是没有输入行以ALT或CONFIG_SYS开头,因为它们都以#define开头。

尝试这样的事情:

#!/usr/bin/env perl

use strict;
use warnings;

open my $fh, '<', 'input.txt' or die $!;

while (<$fh>) {
    s/,.+//;
    print;
}
close $fh;

运行方式如下:

alex@yuzu:~$ perl stack.pl
#define PIOMUX2_UART_3_RXD   CONFIG_PIO31_5_SELECTOR
#define PIOMUX2_UART_3_TXD   CONFIG_PIO31_6_SELECTOR
#define PIOMUX2_UART_3_CTS   CONFIG_PIO31_7_SELECTOR

答案 1 :(得分:1)

试试这个。

简单的grep功能就足够了。

open my $handle, '<', 'file.txt' or die $!;
my @ar =  grep{~s/,.+//g} <$handle>;
print @ar;

答案 2 :(得分:0)

试试这个:

# cat test 
#define PIOMUX2_UART_3_RXD   CONFIG_PIO31_5_SELECTOR,   ALT_2,   CONFIG_SYSCFG_PIO31_5_OE,   I
#define PIOMUX2_UART_3_TXD   CONFIG_PIO31_6_SELECTOR,   ALT_2,   CONFIG_SYSCFG_PIO31_6_OE,   O
#define PIOMUX2_UART_3_CTS   CONFIG_PIO31_7_SELECTOR,   ALT_1,   CONFIG_SYSCFG_PIO31_7_OE,   I

# perl -a -F, -lne 'print $F[0]' test 
#define PIOMUX2_UART_3_RXD   CONFIG_PIO31_5_SELECTOR
#define PIOMUX2_UART_3_TXD   CONFIG_PIO31_6_SELECTOR
#define PIOMUX2_UART_3_CTS   CONFIG_PIO31_7_SELECTOR

有关perl命令行参数说明,请参阅:https://blogs.oracle.com/ksplice/entry/the_top_10_tricks_of

@ Grace90,对于给定的样本数据,从列的角度查看文件。另外,请考虑所有这些列都用逗号分隔。因此,简而言之,您要提取文件的第一列,其列以逗号分隔。

所以对于上面的命令行:

-F,将逗号定义为字段分隔符。 分割文件的每一行后,它将保存在数组F中。 然后我只打印此数组的第一个元素$f[0]

答案 3 :(得分:0)

您可以在命令行中解决它:

perl -p -i.bak -e "s/([^,]+),.*/$1/" my_data_file.txt

这会更改您的数据文件(my_data_file.txt),并创建备份(my_data_file.bak)

答案 4 :(得分:-2)

通过使用split功能,您也可以获得输出。

use warnings;
use strict;

open my $fh, '<', 'file.txt' or die $!;
while (<$fh>)
{
  my @data = split(',', $_);
  print "$data[0]\n";
}
close($fh);