在一个文件夹里面我有一些文件
UEDP01_20120821.csv
UEDP02_20120821.csv
UEDP03_20120821.csv
UEDP04_20120821.csv
UEDP05_20120821.csv
Run Code Online (Sandbox Code Playgroud)
只想检查所有文件是否存在.如果缺少任何一个文件,则需要创建一个具有相同名称的空文件.
例如:
UEDP01_20120821.csv
UEDP02_20120821.csv
UEDP04_20120821.csv
UEDP05_20120821.csv
Run Code Online (Sandbox Code Playgroud)
UEDP03_20120821.csv如果缺少此文件,则需要创建相同的文件.
我想搜索-c使用grep
例如:
$>ls -al | grep '-c'
Run Code Online (Sandbox Code Playgroud)
但grep认为这是一种选择.
$>Usage: grep -hblcnsviw pattern file . . .
Run Code Online (Sandbox Code Playgroud)
如何搜索-c字符串?
当我在我的主目录中并在终端中键入"ls*s*"时,它会显示所有名称中包含"s"的文件夹和文件(例如音乐).但是当我输入"ls*si*"时,它没有显示任何内容(我认为应该列出音乐).这是为什么?
我希望我能清楚地表达我的问题.具体来说,就是这样:
我想使用test或者case case语句来确定变量$ DIR中包含的目录名是否是我当前的目录(.)或它的父目录(..)
当然我可以回显我当前的目录(echo $ PWD),但回显$ PWD父母的最简单方法是什么?
谢谢.
我想要完成的是取一个文件名让我们说myfileRE.txt并返回新的文件名myfile.txt.额外的两个字符总是两个字符,所以我试图做的是:
${filename%??.}
Run Code Online (Sandbox Code Playgroud)
而且我的想法是"匹配在这段时间之前出现的2个字符并将这些字符撕掉"..很遗憾,它只返回了整个文件名.
我最终这样做了:
${filename%??????}.txt
Run Code Online (Sandbox Code Playgroud)
但那不是很友好,必须有一个更清洁的方法来做到这一点.有什么建议?也许有正则表达式的东西?
我试图从以下system()调用ksh脚本中找到退出代码36096的含义.
$proc_ret = system("/path/to/shellscript.sh");
Run Code Online (Sandbox Code Playgroud)
$ proc_ret返回"36096"
我检查了shellscript.sh的输出,它运行正常,直到调用了shellscript.sh中的另一个shell脚本(status.sh).只调用该脚本的第一行,不调用脚本的其余部分.
这是status.sh的内容
echo "a" > /tmp/a
echo "complete."
echo "b" >> /tmp/a
cat /path/to/mail.txt | mail -s "subject" email@domain
echo "mail complete."
echo "c" >> /tmp/a
Run Code Online (Sandbox Code Playgroud)
我不知道为什么脚本在第一行之后没有继续.对shellscript.sh进行系统调用的退出代码对我来说很奇怪.如果有人知道36096的含义,请告诉我.
在Linux/AIX- Unix中使用bash/ksh获取巨大CSV文件的特定列中的非数字值和行号的最快方法是什么.
假设我有以下格式的数据,
1,AAA,486254452,1F
2,BAF,265363,6A
3,AFHGJ, ,3G
...
50000,GAJGFGS,.,5H
...
100000,GHFHFFS,47,6L
Run Code Online (Sandbox Code Playgroud)
考虑到CSV中的行数可以很容易地为100,000,这是识别第3列中具有非数字值的行号的最快方法.非数字必须包含 - space,'.'.
我尝试了一个shell脚本并循环遍历文件的每一行,但这需要花费很多时间.
line=0
while read lineOfCSV
3rdCol=`echo $lineOfCSV | cut -d ',' -f3`
line=`expr $line +1`
if ! [[ $3rdCol=~ '^[0-9]+$' ]] ; then
echo "Line = :$line: NON-NUMERIC VALUE :$3rdCol:"
fi
done < data.csv
Run Code Online (Sandbox Code Playgroud)
我为上面的代码运行了80000行的CSV文件,处理时间超过10分钟.所以我停止了脚本并用谷歌搜索更快的解决方案.我找不到具体的东西.所以我在这里发布了这个问题.
我有一个脚本,看起来像下面的例子.我有一个字母偏移,我需要打印我用偏移量计算的字母.我不知道如何使用ksh阅读那封信.
我期望的答案是LETTER_OFFSET(1)= a,LETTER_OFFSET(2)= v,LETTER_OFFSET(3)= c等.我在循环内计算了它的偏移量.
#!/bin/ksh
# 1 2 3 4 5 6 7 8 9 10 11 12
LETTERS=" a v c d g r g s s a g f"
LETTER_OFFSET="3";
Letter=$(echo $LETTERS | awk '{print $((1 * $$LETTER_OFFSET )) }')
Run Code Online (Sandbox Code Playgroud) Perl系统调用必须将以下字符串发送到UnixShell:
'"XYZ"'
Run Code Online (Sandbox Code Playgroud)
在我的Perl脚本中,我使用了以下命令:
system("cleartool mkattr -replace ATTRIBUTE '"$attribute"' lbtype:$label");
Run Code Online (Sandbox Code Playgroud)
Shell Unix除了两个引用字符的使用外,一切都很好地传递给了:
'
Run Code Online (Sandbox Code Playgroud)
确实,
cleartool mkattr -replace ATTRIBUTE
Run Code Online (Sandbox Code Playgroud)
传递上面的命令,因为它正是我想要的.Perl变量$ attribute和$ label被很好地解释.但我不知道该怎样做才能获得:
'"XYZ"'
Run Code Online (Sandbox Code Playgroud)
这里XYZ是Perl变量$属性OS是价值AIX (Unix)和Shell为ksh.cleartool是Clearcase的命令行界面,但修复我的问题不需要Clearcase技能.
我正在编写KSH Shell脚本。它从JSON文件中读取,该文件包含控制字符(如)\n,\r并\t代替实际的换行符或制表符(因此,控制字符被作为实际的字符串读取)。我正在使用jq此JSON文件解析所需的内容,并将其附加到文本文件中。该文本文件还最终具有字符串,如\n,\t而不是换行符,制表符等。我希望文本文件具有这些控制字符的实际含义。
例如,对于字符串"I\nam\na\ngood\nboy",我希望我的文件具有:
I
am
a
good
boy
Run Code Online (Sandbox Code Playgroud)
关于如何在Shell脚本中完成此操作的任何想法?
注意:我用KSH写作,但是以bash等答案是可以接受的。