我有一个文本格式的大型数据文件,我想通过指定每个列长度将其转换为csv.
列数= 5
列长
[4 2 5 1 1]
Run Code Online (Sandbox Code Playgroud)
样本观察:
aasdfh9013512
ajshdj 2445df
Run Code Online (Sandbox Code Playgroud)
预期产出
aasd,fh,90135,1,2
ajsh,dj, 2445,d,f
Run Code Online (Sandbox Code Playgroud) 我有一个管道分隔的feed文件,它有几个字段.由于我只需要一些,我想用它awk来捕获它们用于我的测试目的.但是,我注意到printf如果我使用它会更改值"%d".如果我使用,它工作正常"%s".
[jaypal:~/Temp] cat temp
302610004125074|19769904399993903|30|15|2012-01-13 17:20:02.346000|2012-01-13 17:20:03.307000|E072AE4B|587244|316|13|GSM|1|SUCC|0|1|255|2|2|0|213|2|0|6|0|0|0|0|0|10|16473840051|30|302610|235|250|0|7|0|0|0|0|0|10|54320058002|906|722310|2|0||0|BELL MOBILITY CELLULAR, INC|BELL MOBILITY CELLULAR, INC|Bell Mobility|AMX ARGENTINA SA.|Claro aka CTI Movil|CAN|ARG|
我有兴趣捕捉second column它是哪个19769904399993903.
[jaypal:~/Temp] awk -F"|" '{printf ("%d\n",$2)}' temp
19769904399993904 # Value is changed
Run Code Online (Sandbox Code Playgroud)
但是,以下两个测试工作正常 -
[jaypal:~/Temp] awk -F"|" '{printf ("%s\n",$2)}' temp
19769904399993903 # Value remains same
[jaypal:~/Temp] awk -F"|" '{print $2}' temp
19769904399993903 # Value remains same
Run Code Online (Sandbox Code Playgroud)
所以这是一个"%d"无法处理长整数的限制.如果是这样的话,为什么会在数字中加一个而不是截断呢?
我试过这个BSD和GNU版本的awk. …
如何使用没有文件的awk进行打印.
script.sh
#!/bin/sh
for i in {2..10};do
awk '{printf("%.2f %.2f\n", '$i', '$i'*(log('$i'/('$i'-1))))}'
done
Run Code Online (Sandbox Code Playgroud)
sh script.sh
Desired output
2 value
3 value
4 value
and so on
Run Code Online (Sandbox Code Playgroud)
value表示计算后的数量
我正在尝试使用SED脚本进行模式替换,但它无法正常工作
sample_content.txt
288Y2RZDBPX1000000001dhana
JP2F64EI1000000002d
EU9V3IXI1000000003dfg1000000001dfdfds
XATSSSSFOO4dhanaUXIBB7TF71000000004adf
10Q1W4ZEAV18LXNPSPGRTTIDHBN1000000005egw
Run Code Online (Sandbox Code Playgroud)
patterns.txt
1000000001 9000000003
1000000002 2000000001
1000000003 3000000001
1000000004 4000000001
1000000005 5000000001
Run Code Online (Sandbox Code Playgroud)
预期产出
288Y2RZDBPX9000000003dhana
JP2F64EI2000000001d
EU9V3IXI3000000001dfg9000000003dfdfds
XATSSSSFOO4dhanaUXIBB7TF74000000001adf
10Q1W4ZEAV18LXNPSPGRTTIDHBN5000000001egw
Run Code Online (Sandbox Code Playgroud)
我可以用单个SED替换像
sed 's/1000000001/1000000003/g' sample_content.txt
Run Code Online (Sandbox Code Playgroud)
注意:
文件附件链接: https ://drive.google.com/open?id = 1dVzivKMirEQU3yk9KfPM6iE7tTzVRdt_
谁能建议如何在不影响性能的情况下实现这一目标
更新于2018年2月11日
在分析了真实文件之后,我得到了一个提示,即在第30和第31位有一个等级值.这有助于我们在需要的地方和所有地方申请更换.
如果等级AB则在更换的10位数电话号码41-50和101-110
如果等级BC然后在更换的10位数电话号码,11-20,61-70和151-160
如果等级DE再更换10位数的电话号码在1-10,71-80,151-160和181-190
像这样,我看到了200个样本记录的50个独特等级.
{ grade=substr($0,110,2)} // identify grade
{
if (grade == "AB") {
print substr($0,41,10) ORS substr($0,101,10)
} else if(RT …Run Code Online (Sandbox Code Playgroud) 我经常发现自己在动作中与模式进行相同的匹配,以访问输入记录的某些部分,例如
/^Compiled from \"(.*)\"$/ {
file_name = gensub("^Compiled from \"(.*)\"$", "\\1", "g");
print file_name;
}
Run Code Online (Sandbox Code Playgroud)
所以正则表达式匹配完成了两次.我有什么方法可以\\1在动作中访问而不再匹配?
我试图减少pattert匹配和额外的代码.
我需要###用当前行号替换模式.
我设法在AWK和SED的下一行打印.
sed -n "/###/{p;=;}" file打印到下一行,没有p;,它取代整行.
sed -e "s/###/{=;}/g" file过去在我脑海中有意义,因为=;返回匹配模式的行号,但它会返回文本{=;}
我想念的是什么?我知道这是一个愚蠢的问题.我在sed手册中找不到这个问题的答案,现在还不是很清楚.
如果可能的话,请指出我错过了什么,以及让它成功的原因.谢谢
我希望能够将数组变量传递给awk. 我指的不是 shell 数组,而是本机数组awk。我知道我可以像这样传递标量变量:
awk -vfoo="1" 'NR==foo' file
Run Code Online (Sandbox Code Playgroud)
我可以使用相同的机制来定义awk数组吗?就像是:
$ awk -v"foo[0]=1" 'NR==foo' file
awk: fatal: `foo[0]' is not a legal variable name
Run Code Online (Sandbox Code Playgroud)
我已经尝试了上述几种变体,但它们都不适用于我的 Debian 上的 GNU awk 4.1.1。那么,有没有任何版本awk(gawk,mawk或其他任何东西),可以接受来自一个数组-v开关?
我知道我可以解决这个问题并且可以很容易地想到这样做的方法,我只是想知道是否有任何awk实现本身支持这种功能。
假设我有以下csv文件:
id,message,time
123,"Sorry, This message
has commas and newlines",2016-03-28T20:26:39
456,"It makes the problem non-trivial",2016-03-28T20:26:41
Run Code Online (Sandbox Code Playgroud)
我想编写一个只返回时间列的bash命令.即
time
2016-03-28T20:26:39
2016-03-28T20:26:41
Run Code Online (Sandbox Code Playgroud)
最直接的方法是什么?您可以假设标准unix工具的可用性,例如awk,gawk,cut,grep等.
注意存在的"逃逸",以及用于进行琐碎尝试的换行符
cut -d , -f 3 file.csv
Run Code Online (Sandbox Code Playgroud)
徒劳的.
使用时会发生什么$1,$2...在END块,如:
awk '{print $3}END{print $1 $2}'
Run Code Online (Sandbox Code Playgroud)
我发现$1并$2保留了最后一条记录的值.这种行为是由标准保证还是特定于实现?
有没有办法在awk-gawk中最有可能将记录分隔符设置RS为空值,以将字符串的每个字符作为单独的记录处理?有点像设置FS为空以分隔其自己的字段中的每个字符:
$ echo abc | awk -F '' '{print $2}'
b
Run Code Online (Sandbox Code Playgroud)
但要将它们分别作为单独的记录分开,例如:
$ echo abc | awk -v RS='?' '{print $0}'
a
b
c
Run Code Online (Sandbox Code Playgroud)
最明显的一个:
$ echo abc | awk -v RS='' '{print $0}'
abc
Run Code Online (Sandbox Code Playgroud)
没有奖励我(因为那个显然是为了每个GNU awk文档的其他东西).
我基本上卡住使用for等?
编辑:
@ xhienne的回答是我正在寻找的,但即使使用它(20个字符和一个可疑的变量A:):
$ echo abc | awk -v A="\n" -v RS='(.)' -v ORS="" '{print(RT==A?NR:RT)}'
abc4
Run Code Online (Sandbox Code Playgroud)
不会帮我缩短我之前使用的代码length.然后,我怎么能赢得Pyth代码+Qfql+Q:: D.