如何在SED,尴尬或其他任何内容中编辑以下行: root@laptop002:/tmp# cat /tmp/log 2016-03-01 06:08:26 {"id":"778640","cuid":"1","msid":"199033","lid":"582","Started":"1","qid":"9401"} batch is running 使它看起来如下: 2016-03-01 06:08:26 "msid":"199033" batch is running 或 2016-03-01 06:08:26 msid is 199033 batch is running 或 2016-03-01 06:08:26 msid=199033 batch is running 解决方案 $ awk -F'[{,}]' '{print $1, $4, $NF}' file 2016-03-01 06
以下是关于 gawk 的编程技术问答
我想删除列数据中的任何不可打印的新系字符. 我已经用双引号封闭了所有列,以轻松删除列中存在的新行字符,并在行的每一端后忽略记录定界符. 说,我有4列被逗号分开,并在文本文件中被引号包裹. 我只是尝试删除\ n和\ r字符,当时它存在于双引号之间 当前使用的装饰,但它删除了每个线路断开,并将其制成一个序列文件,而没有任何记录分离器. tr -d '\n\r' out.txt 样本数据: " 1","测试\ n 示例"," data"," col4" \ n " 2 \ n ","测试","示例","数据" \ n " 3"," sam \ n ple"," te \ n st","数据" \ n 预期输出: " 1"," testSample"," data"," col4" \ n " 2","测试","示例","数据" \ n " 3","示例","测试","数据" \ n
过去几天我一直在寻找一套命令行工具,一个perl或awk脚本,使我可以很快地转换以下数据: Row|Col|Val 1|A|foo 1|B|bar 1|C|I have a real 2|A|bad 2|C|hangover 进入这个: A|B|C foo|bar|I have a real bad||hangover 请注意,每个"单元格"的数据集中只有一个值(即,与电子表格一样,行" 1" 1" col" a" a") 没有任何重复. 我尝试了各种尴尬的实现来转移数据 - 但似乎无法使它们起作用.我的一个想法是将每个" col"值切入一个单独的文件中,然后使用"加入"命令行将它们放回"行"中 - 但是必须有一种更简单的方法.我敢肯定这简直太简单了 - 但是我正在努力. 我的输入文件具有cols a至g(主要包括可变长度字符串)和10,000行.如果我可以避免将所有内容加载到内存中,那将是一个巨大的优势. bee beer-mail供任何答案的人!
我有两个列数 的文件 file1: A 1 2 3 ....... Na1 B 2 3 4 ....... Nb1 file2: A 2 2 4 ....... Na2 B 1 3 4 ....... Nb2 我想要一个输出,其中File1中的第一列值将从File2的第1列中减去1,然后使用列,直到n列N,如下所示: A -1 0 -1 ........ (Na1-Na2) B 1 0 0 ........ (Nb1-Nb2) 如何做到这是尴尬,或在Linux环境中拼写脚本? 解决方案 类似的东西: use strict; use warnings; my (@fh, @v); for (@ARGV) { open (my $handle, "
我试图使用sed脚本进行模式替换,但它无法正常工作 sample_content.txt 288Y2RZDBPX1000000001dhana JP2F64EI1000000002d EU9V3IXI1000000003dfg1000000001dfdfds XATSSSSFOO4dhanaUXIBB7TF71000000004adf 10Q1W4ZEAV18LXNPSPGRTTIDHBN1000000005egw staterss.txt 1000000001 9000000003 1000000002 2000000001 1000000003 3000000001 1000000004 4000000001 1000000005 5000000001 预期输出 288Y2RZDBPX9000000003dhana JP2F64EI2000000001d EU9V3IXI3000000001dfg9000000003dfdfds XATSSSSFOO4
我有几个大型日志文件,其中包括以下格式的行: /resource/text_(moretext 现在,这些需要用")"")",但是文件太大而无法手动执行此操作.不幸的是,行中的文字可以是任何东西.因此,我认为我需要一些能够找到所有具有"("和no")"的线条.然后,这些行必须用完全相同的内容替换,但")"添加到末端. 所以看起来应该像这样: 之前: /resource/text_(moretext 之后: /resource/text_(moretext) 我觉得使用正则表达式在记事本++中应该可以做到这一点,但是我很难弄清楚如何做到这一点. 我需要这个,因为我将这些日志与.ttl文件进行比较以提取两个文件中可以找到的行.我使用以下AWK脚本这样做: BEGIN { IGNORECASE = 1 } # ignoring the case NR==FNR { a[$1]; next } # hash csv
假设我有一个文本文件,其中包含以下表格的记录,其中FS通常在讲逗号,RS通常在说newline. 但是,此规则的例外是,如果一个字段在引号中,则应将线路断裂和逗号视为该领域的一部分. "This field contains line breaks and is quoted but it should be treated as a single field",1,2,3,"another field" 如何正确解析这样的文件,我仍然可以像往常一样访问$1,$2...,但是通过上述字段解释? 我已经看过此Wiki页面解决线路断裂的问题. 解决方案 一个可能的解决方案是:awk 'BEGIN{RS="\""}{...}'.通过这样做,您将记录分离器重置为",而字段分隔符仍然是一个空间.问题在于,这将在您的文件中添加两个空记录,因为第一个和最后一个"将匹配以划定某些记录. 示例: awk 'BEGIN{RS="\""} {print $0,"
我无法获得awk或gawk读取科学符号的小浮子,并正确解释为浮点数. 我只想用尴尬的小门槛输出数字. 示例: 考虑以下输入: 4 3e-20 4.5e-320 3 1e-10 我想在1E-15之前阈值,所以我要做以下操作: echo -e "4\n3e-20\n4.5e-320\n3\n1e-10" | awk '$1 > 1e-15' 给出输出: 4 4.5e-320 3 1e-10 当然,4.5e-320不会通过1E-15阈值,而是awk和gawk无法拒绝它! 我查找(g)awk浮点精度.它似乎仅适用于 awk. 因此,用awk '$1 > 1e-15'代替gawk -v PREC="double" '$1 > 1e-15'也会失败.它也因PREC="quad" 而失败 因此,我得出结论,(g)awk不是读取 4.5e-320作为浮点,而是字符串? 解决方案 我从AWK版本3.1.5获得预期输出. 我从
我尝试在尴尬中创建一个伪二维数组. # Calculate cumulative context score BEGIN { FS=OFS="\t" } { a[$2+FS+$7,$3]+=$6 } END { for (i,j) in a { print i,j,a[i,j] } } 输出: awk: ccstscan.awk:9: END { for (i,j) in a awk: ccstscan.awk:9: ^ syntax error 这就是GNU尴尬手册中提到的内容: 测试特定索引序列是否存在 多维数组,使用用于 单维数组.在 括号,被逗号隔开,左操作数: (subscript1, subscript2, ...) in array 我尝试修改脚本以创建一个真实的维度数组: BEGIN { FS=OFS="\t" } { a[$2+FS+$7][$3]+=$
我正在从Windows CMD发出GAWK命令,但它只是卡在那里.Same命令在Cygwin终端中工作得很好. 我试图在第30行之后的文件中找到第一个列上结束撑杆"}"的首次出现 命令是 gawk 'NR > 30 && /^}$/ { print NR; exit }' Filename.c > Output.txt 我注意到另一件事是,当我发出命令表格CMD时,除了粘贴它还创建一个具有行号的文件(如果执行上述命令,则创建了30个) ) 解决方案 命令行 gawk 'NR > 30 && /^}$/ { print NR; exit }' Filename.c > Output.txt 由于有两个原因,Windows命令解释器不会像预期的那样解释: 与Unix和Linux Shell相比,直句在Windows命令行上没有特殊的含义.因此 gawk的参数字符串包含Windows命令进程中具有特殊含义的几个字符: > ...重定向操作员
我试图根据黑名单文件过滤目录中的多个文件 当我使用一行而没有循环时,脚本可以正常工作... awk >rest.txt 'NR==FNR{_[$1];next}!($1 in _)' FS=" " blist_file.txt main_file.txt 但是,当我添加循环时,我会遇到错误,可能是错误的? $ for f in main_file* do awk >res_$f 'NR==FNR{_[$1];next}!($1 in _)' FS=" " blist_file.txt $f; done -bash: syntax error near unexpected token `> 解决方案 您缺少半彩色.这个: for f in main_file* do 应该从语法上说: for f in main_file*; do 但是,无论如何,这当然是错误的方法 - 只要致电一次: awk ' NR==FNR {blist[$
我希望Gawk使用comma ,作为小数点字符来解析数字. 因此,我将LC_NUMERIC设置为fr_FR.utf-8,但它不起作用: echo 123,2 | LC_NUMERIC=fr_FR.utf-8 gawk '{printf ("%.2f\n", $1 + 0) }' 123.00 解决方案是指定选项--posix或export POSIXLY_CORRECT=1,但是在这种情况下,GNU awk扩展不可用,例如delete或gensub函数: echo 123,2 | LC_NUMERIC=fr_FR.utf-8 gawk --posix '{printf ("%.2f\n", $1 + 0) }' 123,20 是否可以将gawk解析数字用,作为小数点而无需指定 POSIX选项? 解决方案 您正在寻找的选项是: - 使用lc-numeric 这迫使Gawk在解析输入数据时使用该语言环境的小数点字符.尽管Posix标准需要此 行为,而g
W命令产生类似的东西: 01:19:02 up 53 days, 10:44, 15 users, load average: 0.00, 0.02, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT higrheht pts/5 c-13-76-207-161. 23:21 2:05 0.07s 0.07s -bash sgergrgr pts/6 c-97-164-31-14.h 00:54 2.00s 0.04s 0.04s -bash jwegrgrng pts/14 c-23-71-12-251.h 22:48 8:03 0.07s 0.06s vim s2 hiqrefan pts/18 c-13-31-206-169. 23:19 0.00s 0.01s 0.01s -bash hqeffran pts/1
(无法提供任何更好的标题) 我正在尝试转换许多行,例如: #define GENERIC_TYPE_METER_PULSE 0x30 /*Pulse Meter*/ #define SPECIFIC_TYPE_NOT_USED 0x00 /*Specific Device Class not used*/ ...... #define MFG_ID_WAYNE_DALTON 0x0008 //Wayne Dalton #define MFG_ID_WILSHINE_HOLDING_CO_LTD 0x012D //Wilshine Holding Co., Ltd #define MFG_ID_WIDOM 0x0149 //wiDom ....
我有许多文件的文件: col1,col2,col3,col4 您可以忽略Col1-Col3. Col4包含一个数字.每个文件包含约200行.我试图在整行中总结.例如: 文件1 COL1 COL2 COL3 COL4 x y z 3 a b c 4 文件2 COL1 COL2 COL3 COL4 x y z 5 a b c 10 然后返回一个新文件: COL1 COL2 COL3 COL4 x y z 8 a b c 14 是否有一种简单的方法可以执行此操作 awk?如果需要的话,我会使用尴尬,我只是认为可能会立即跑步的简单单线.我想到的尴尬脚本感觉有点长. 谢谢 解决方案 另外一个选项. 命令: paste f{1,2}.txt | sed '1d' | awk '{print $1,$2,$3
这是columns.txt aaa bbb 3 ccc ddd 2 eee fff 1 3 3 g 3 hhh i jjj 3 kkk ll 3 mm nn oo 3 我可以找到第二列以" B"开头的行: awk '{if(substr($2,1,1)=="b") {print $0}}' columns.txt 我可以找到第二列以" bb"开头的行: awk '{if(substr($2,1,2)=="bb") {print $0}}' columns.txt 为什么哦,为什么我找不到第二列中的第二个字符是" b"的行?: awk '{if(substr($2,2,2)=="b") {print $0}}' columns.txt awk -W version == gnu awk 3.1.8 解决方案 您可以使用: awk 'substr($2,2,1) == "b"' columns.txt aaa
我有两个文件,我需要根据时间列对行进行排序和合并: 文件A: "2014-02-26 16:03:04" "Login Success|isNoSession=false" id=csr,ou=user,dc=openam,dc=forgerock,dc=org 7efb2f0e035a0e3d01 10.17.174.30 INFO dc=openam,dc=forgerock,dc=org "cn=dsameuser,ou=DSAME Users,dc=openam,dc=forgerock,dc=org" AUTHENTICATION-100 DataStore "Not Available" 10.17.174.30 文件B: "2014-02-26 16:02:27" "Login Failed" dennis "Not Available" 10.17.174.30 INFO dc=openam,
我正在尝试做以下操作,但是我太累了,无法想到,或者有些奇怪的事情正在逃脱: scanimage -L | gawk '/N650U/ {print gensub("[\'`]", "", "g", $2)}' pipe bquote> 解决方案 这样做的成语是创建一个包含单个报价的变量,然后使用: scanimage -L | gawk '/N650U/ {print gensub(q"`", "", "g", $2)}' q="'" 但是,由于您在角色类中使用它,所以这无法正常工作,因此您需要这样做: scanimage -L | gawk '/N650U/ {print gensub("[`'\'']", "", "g", $2)}' 如果使用bash是使用$'' dos 支持逃脱单引号 scanimage
我有一个带有模板的输入文件,如下所示.我想更改版本:使用sed. Package: somename Priority: extra Section: checkinstall Maintainer: joe@example.com Architecture: i386 Version: 3.1.0.2-1 Depends: Provides: somename Description: some description 当前我正在使用grep -m 1 Version inputfile | sed 's/[:_#a-zA-Z\s"]*//g'获得当前版本,并且我正在尝试用sed 's/3.1.0.2-1/3.1.0.2/' inputfile 替换当前版本 但是,这似乎不起作用,但是当我使用Echo在命令行中尝试它时,它起作用. echo 'Version: 3.0.9.1' | sed 's/3.