假设我有一个文本文件,其中的数据由空格分隔成列.我想编写一个shell脚本,它将文件名和数字N作为输入,只打印出该列.使用awk我可以执行以下操作:
awk < /tmp/in '{print $2}' > /tmp/out
Run Code Online (Sandbox Code Playgroud)
此代码打印出第二列.
但是如何在shell脚本中包装它以便在argv中传递任意列?
我使用R进行数据分析,对此非常满意.但是,清洁数据可能会更容易一些.我正在考虑学习适合这项任务的另一种语言.具体来说,我正在寻找一种工具,用于获取原始数据,删除不必要的变量或观察,并格式化它以便在R中轻松加载.内容主要是数字和字符串数据,而不是多行文本.
我正在考虑awk/sed组合与Python.(我认识到Perl将是另一种选择,但是,如果我要学习另一种完整语言,Python似乎是一种更好,更可扩展的选择.)
sed/awk的优点是学习起来会更快.缺点是这种组合不像Python那样可扩展.事实上,如果我学习Python,我可能会想象一些"任务蔓延",这很好,但不是我的目标.
我的另一个考虑因素是大数据集的应用程序.据我所知,awk/sed逐行操作,而Python通常会将所有数据都拉入内存.这可能是sed/awk的另一个优势.
我还缺少其他问题吗?您可以提供的任何建议将不胜感激.(我为R用户提供了R标签,以提供他们的清洁建议.)
我正在编写一个单行命令,它将所有数据库备份到各自的名称中,而不是使用在一个sql中转储所有数据库.
例如:db1保存到db1.sql,db2保存到db2.sql
到目前为止,我收集了以下命令来检索所有数据库.
mysql -uuname -ppwd -e 'show databases' | grep -v 'Database'
Run Code Online (Sandbox Code Playgroud)
我打算用awk来管它做类似的事情
awk '{mysqldump -uuname -ppwd $1 > $1.sql}'
Run Code Online (Sandbox Code Playgroud)
但这不起作用.
我是bash的新手,所以我的想法可能是错的.
我该怎么做才能让它以各自的名义导出数据库?
更新:
好的,必须最终设法让它从下面的提示工作.
这是最后的脚本
# replace [] with your own config
# replace own dir to save
# echo doesn't work. hmm...
mysql -u[uname] -p'[pwd]' -e "show databases" \
| grep -Ev 'Database|information_schema' \
| while read dbname; \
do \
echo 'Dumping $dbname' \
mysqldump -u[uanme] -p'[pwd]' $dbname > ~/db_backup/$dbname.sql;\
done
Run Code Online (Sandbox Code Playgroud)
回声部分虽然不起作用.
任何人都可以帮我解决这个问题吗?
我正在尝试将awk输出保存到变量中.
variable = `ps -ef | grep "port 10 -" | grep -v "grep port 10 -"| awk '{printf "%s", $12}'`
printf "$variable"
Run Code Online (Sandbox Code Playgroud)
编辑:$ 12对应于在该进程上运行的参数.
谢谢!
我需要在逗号分隔值文件中删除2列.请考虑csv文件中的以下行:
"abc@xyz.com,www.example.com",field2,field3,field4
"def@xyz.com",field2,field3,field4
Run Code Online (Sandbox Code Playgroud)
现在,我想要的结果是:
"abc@xyz.com,www.example.com",field4
"def@xyz.com",field4
Run Code Online (Sandbox Code Playgroud)
我使用以下命令:
awk 'BEGIN{FS=OFS=","}{print $1,$4}'
Run Code Online (Sandbox Code Playgroud)
但是引号内的嵌入式逗号会产生问题,以下是我得到的结果:
"abc@xyz.com,field3
"def@xyz.com",field4
Run Code Online (Sandbox Code Playgroud)
现在我的问题是如何让awk忽略双引号内的","?
我需要使用选项卡替换斜杠字符,以便使用awk提取目录名称.
/path/to/some/USEFUL_INFORMATION/in/some/path
Run Code Online (Sandbox Code Playgroud)
我尝试过这样做,但它所做的只是在我的输出中加上"t".
sed -e 's/\//\t/g' filename
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激.
数据文件 - data.txt:
ABC "I am ABC" 35 DESC
DEF "I am not ABC" 42 DESC
Run Code Online (Sandbox Code Playgroud)
cat data.txt | awk '{print $2}'
将导致"I"而不是被引用的字符串
如何制作awk以便忽略引号中的空格并认为它是一个单一的令牌?
在下面的awk命令中
awk '{sum+=$1; ++n} END {avg=sum/n; print "Avg monitoring time = "avg}' file.txt
Run Code Online (Sandbox Code Playgroud)
我应该更改什么来删除科学记数法输出(非常小的值显示为1.5e-05)?
我无法使用OMFT变量成功.
有没有办法打印OFS分隔的所有记录而不输入每个列号.
#Desired style of syntax, undesired result
[kbrandt@glade: ~] echo "1 2 3 4" | gawk 'BEGIN { OFS=" :-( "}; {print $0}'
1 2 3 4
#Desired result, undesired syntax
[kbrandt@glade: ~] echo "1 2 3 4" | gawk 'BEGIN { OFS=" :-) "}; {print $1,$2,$3,$4}'
1 :-) 2 :-) 3 :-) 4
Run Code Online (Sandbox Code Playgroud) 我有一堆文件,所有文件都Account number: 123456789在不同的位置.
我需要做的是能够解析文件,并找到帐号本身.因此,awk需要寻找Account number:并立即返回字符串.
例如,如果是:
Account number: 1234567
Run Code Online (Sandbox Code Playgroud)
awk 应该返回:
1234567
Run Code Online (Sandbox Code Playgroud)
一旦发现它第一次出现就可以停止寻找.
但是,我很难过.使用这种方法的正确方法是什么awk?