sed
如果我需要提取由特定模式包围的模式(如果它存在于一行中),我可以使用吗?
假设我有一个包含以下行的文件:
有许多人不敢为邻居所说的[/恐惧/]而自杀.
当我们已经知道
/*
答案时,建议就是我们所要求的,*/
但希望我们没有.
在这两种情况下,我必须扫描线以获得第一个出现的模式,即在各自的情况下为"[ /
或/*
",并存储以下模式,直到分别退出模式,即' /
]'或' */
.
简而言之,我需要fear
和answer
.如果可能,可以扩展多行;从某种意义上说,如果退出模式出现在不同于同一行的行中.
欢迎以建议或算法的形式提供任何形式的帮助.在此先感谢您的回复
我一直在使用Linux env,最近迁移到solaris.不幸的是我的bash脚本中的一种需要使用grep
与P
开关[PCRE支持].作为的Solaris犯规支持pcre
的grep的选项,我不得不另寻解决的问题; pcregrep
似乎有一个明显的循环错误和 sed
-r
选项是不支持!我希望使用perl
或nawk
将解决solaris上的问题.
我还没有perl
在我的脚本中使用它并不知道它的语法和标志.
既然是pcre
,我beleive,一个perl
编剧可以帮我在几分钟之内.它们应匹配多行.
在效率awk
或perl
解决方案方面哪一个是更好的解决方案?
谢谢你的回复.
是否可以将默认的正则表达式分隔符(斜杠)更改为其他字符?
我尝试使用sed语法来实现它,但它没有用.
$ gawk '\|bash| { print } ' backup.sh
gawk: |bash| { print }
gawk: ^ syntax error
Run Code Online (Sandbox Code Playgroud)
我正在尝试的正则表达式有很多斜线.逃离所有这些将使它变得丑陋和难以理解.我尝试将/更改为 但它不起作用.
TIA
我有以下记录:
31 Stockholm
42 Talin
34 Helsinki
24 Moscow
15 Tokyo
Run Code Online (Sandbox Code Playgroud)
我想用AWK将它转换为JSON.使用此代码:
#!/usr/bin/awk
BEGIN {
print "{";
FS=" ";
ORS=",\n";
OFS=":";
};
{
if ( !a[city]++ && NR > 1 ) {
key = $2;
value = $1;
print "\"" key "\"", value;
}
};
END {
ORS="\n";
OFS=" ";
print "\b\b}";
};
Run Code Online (Sandbox Code Playgroud)
给我这个:
{
"Stockholm":31,
"Talin":42,
"Helsinki":34,
"Moscow":24,
"Tokyo":15, <--- I don't want this comma
}
Run Code Online (Sandbox Code Playgroud)
问题是在最后一条数据行上尾随逗号.它使JSON输出不可接受.我怎样才能得到这个输出:
{
"Stockholm":31,
"Talin":42,
"Helsinki":34,
"Moscow":24,
"Tokyo":15
}
Run Code Online (Sandbox Code Playgroud) 我需要处理两个文件内容.我想知道我们是否可以使用一个nawk声明来解决它.
文件A内容:
AAAAAAAAAAAA 1
BBBBBBBBBBBB 2
CCCCCCCCCCCC 3
Run Code Online (Sandbox Code Playgroud)
文件B内容:
XXXXXXXXXXX 3
YYYYYYYYYYY 2
ZZZZZZZZZZZ 1
Run Code Online (Sandbox Code Playgroud)
我想比较,如果$2
(第二场)在文件中的是相反$2
的文件B.我不知道如何写规则NAWK多文件处理?我们如何将A $2
与B 区分开来$2
编辑:我需要将A的第一行(即1)的2美元与B的最后一行(再次为1)的2美元进行比较.然后比较A中第2行的2美元和第2行的第2行中的2美元.等.....
我有输入文件,如下所示
输入文件
10,9:11/61432568509
118,1:/20130810014023
46,440:4/GTEL
10,9:11/61432568509
118,1:/20130810014023
46,440:4/GTEL
Run Code Online (Sandbox Code Playgroud)
我正在寻找的输出.
10,9:11/61432568509,118,1:/20130810014023,46,440:4/GTEL
10,9:11/61432568509,118,1:/20130810014023,46,440:4/GTEL
Run Code Online (Sandbox Code Playgroud)
我尝试过使用awk命令,但我没有获得所需的输出.任何人都可以帮助我吗?
awk -F"" '{a[$1]=a[$1]FS$2}END{for(i in a) print i,a[i]}' inputfile
Run Code Online (Sandbox Code Playgroud) 我想删除在第四次出现的字符":"之后的任何字段中包含它.看例子:
输入:
1 10975 A C 1/1:137,105:245:99:1007,102,0 0/1:219,27:248:20:222,0,20
1 19938 T TA ./. 1/1:0,167:167:99:4432,422,0,12,12
12 20043112 C G 1/2:3,5,0:15:92 2/2:3,15:20:8
Run Code Online (Sandbox Code Playgroud)
预期产量:
1 10975 A C 1/1:137,105:245:99 0/1:219,27:248:20
1 19938 T TA ./. 1/1:0,167:167:99
12 20043112 C G 1/2:3,5,0:15:92 2/2:3,15:20:8
Run Code Online (Sandbox Code Playgroud)
所以基本上任何具有":"的字段都应该被删除.请注意,第三行没有任何变化,因为":"仅出现三次.我试过并找到了一个解决方案(不好),它不仅适用于第一行而不适用于secod,因为它有更多的逗号","
不完整的解决方案:
sed 's/:[0-9]*,[0-9]*,[0-9]*//g'
Run Code Online (Sandbox Code Playgroud)
提前致谢
我有一个包含下面显示的数据的文件.第一个以逗号分隔的字段可以重复任意次,并且我想在第六次重复此字段的任何值后仅打印行
例如,有八个字段1111111
作为第一个字段,我想只打印这些记录的第七个和第八个
输入文件:
1111111,aaaaaaaa,14
1111111,bbbbbbbb,14
1111111,cccccccc,14
1111111,dddddddd,14
1111111,eeeeeeee,14
1111111,ffffffff,14
1111111,gggggggg,14
1111111,hhhhhhhh,14
2222222,aaaaaaaa,14
2222222,bbbbbbbb,14
2222222,cccccccc,14
2222222,dddddddd,14
2222222,eeeeeeee,14
2222222,ffffffff,14
2222222,gggggggg,14
3333333,aaaaaaaa,14
3333333,bbbbbbbb,14
3333333,cccccccc,14
3333333,dddddddd,14
3333333,eeeeeeee,14
3333333,ffffffff,14
3333333,gggggggg,14
3333333,hhhhhhhh,14
Run Code Online (Sandbox Code Playgroud)
输出:
1111111,gggggggg,14
1111111,hhhhhhhh,14
2222222,gggggggg,14
3333333,gggggggg,14
3333333,hhhhhhhh,14
Run Code Online (Sandbox Code Playgroud)
我试过的是相对于1st转换第2和第3个字段,以便我可以nawk
在$7
或的字段上使用$8
#!/usr/bin/ksh awk -F"," '{ a[$1]; b[$1]=b[$1]","$2 c[$1]=c[$1]","$3} END{ for(i in a){ print i","b[i]","c[i]} } ' file > output.txt
Run Code Online (Sandbox Code Playgroud) 我刚刚在一个有大约2.5亿条记录的文件上运行这两个命令.
awk '{if(substr($0,472,1)=="9") print $0}' < file1.txt >> file2.txt
Run Code Online (Sandbox Code Playgroud)
和
nawk '{if(substr($0,472,1)=="9") print $0}' < file1.txt >> file2.txt
Run Code Online (Sandbox Code Playgroud)
记录长度为482.第一个命令在file2.txt中给出了正确的记录数,即; 6000万,但nawk命令只提供420万.
我很困惑,想知道是否有人遇到过这样的问题.这个简单的命令究竟是如何在内部以不同的方式处理的?有一个缓冲区在使用nawk时只能容纳一定数量的字节吗?
如果有人可以对此有所了解,我将不胜感激.
我的OS详细信息是
SunOS <hostname> 5.10 Generic_147148-26 i86pc i386 i86pc
Run Code Online (Sandbox Code Playgroud) 好的,所以花了两天后,我无法解决它,现在我几乎没时间了.这可能是一个非常愚蠢的问题,所以请耐心等待.我的awk脚本做了这样的事情:
BEGIN{ n=50; i=n; }
FNR==NR {
# Read file-1, which has just 1 column
ids[$1]=int(i++/n);
next
}
{
# Read file-2 which has 4 columns
# Do something
next
}
END {...}
Run Code Online (Sandbox Code Playgroud)
它工作正常.但现在我想将它扩展为3个文件.比方说,我不需要硬编码"n"的值,而是需要读取属性文件并从中设置值"n".我发现了这个问题,尝试过这样的事情:
BEGIN{ n=0; i=0; }
FNR==NR {
# Block A
# Try to read file-0
next
}
{
# Block B
# Read file-1, which has just 1 column
next
}
{
# Block C
# Read file-2 which has 4 columns
# Do something …
Run Code Online (Sandbox Code Playgroud) 我需要将字段的最终大小限制为2048.我可以使用:
ACTION_PARAMETER=substr($2,1,2048);
Run Code Online (Sandbox Code Playgroud)
但有更好的方法吗?
我有一个大的.csv文件要处理,我的元素是随机排列的,如下所示:
XXXXXX,XX, ,MLOCAL
,MREMOTE
,33222
,,56
XXXXXX,XX, ,,,,,
XXXXXX,XX, ,,
XXXXXX,XX, ,,
XXXXXX,XX, ,,,,,
XXXXXX,XX, ,,,,,
XXXXXX, XX, ,,22/10/2012
18/10/2012
MREMOTE
MLOCAL
33222
56
22/10/2012
18/10/2012
MLOCAL
341993
22/10/2012
MREMOTE
9356828
08/10/2012
LOCAL
REMOTE
19316
15253
22/10/2012
22/10/2012
REMOTE
LOCAL
1865871
383666
22/10/2012
22/10/2012
REMOTE
1180306134
19/10/2012
其中字段LOCAL
,REMOTE
,MLOCAL
或MREMOTE
显示等:
MLOCAL
,第4个字段是MREMOTE
,则第5个和第7个字段表示值和日期MLOCAL …