【1】我们有时候希望用shell打乱文本的行,或者叫:以行为单位,打乱文本顺序。
/* 打乱之前 | 打乱之后 */
anHui doc 0 | chuhou txt 2
binHai pdf 1 | binHai pdf 1
chuhou txt 2 | effJone txt 3
effJone txt 3 | anHui doc 0
/*可能有人认为 用sort直接 按第1 列或者第二列 字符串的字典序 排序。
其实,你仔细看看,每列的字符串本来就是按照字典序排好的。因此,
简单的sort 解决不了问题。*/
sort -R 可以打乱。 sort -R file
sort -n -k1 wangbin.txt #作用为 按数字排序,按照第一列排序,输入文件wangbin.txt
#真正能解决问题的是这句话:
awk 'BEGIN{ 10000*srand();}{ printf "%s %s\n", rand(), $0}' input.txt |sort -k1n
| awk '{gsub($1FS,""); print $0}' > output.txt
答: awk '{print $NF}'
答: list.txt 中每行代表一个文本路径,询问当前文本是否包含“2018”这个字符串
cat list.txt |while read line
do
if grep -q "2018" $line
then
echo $line
fi
done
【2】取出文件的特定行。
/* input.txt | output.txt */
anHui doc 0 | binHai pdf 1
binHai pdf 1 | chuhou txt 2
chuhou txt 2 | effJone txt 3
effJone txt 3 |
// 取出文件的第2-4行,行数从0开始。 output.txt 共三行
sed -n '2,4p' input.txt > output.txt
【3】给所有的文本行加前缀
/* input.txt | output.txt */
anHui doc 0 | train/ship/anHui doc 0
binHai pdf 1 | train/ship/binHai pdf 1
chuhou txt 2 | train/ship/chuhou txt 2
effJone txt 3 | train/ship/effJone txt 3
sed 's/^/train\/ship\//g' input.txt > output.txt
【4】查看当前目录下所有图片的分辨率
identify *
---- output ----
98.jpg[4987] JPEG 224x224 224x224+0+0 8-bit DirectClass 4.64KB 0.000u 0:00.000
990.jpg[4988] JPEG 224x224 224x224+0+0 8-bit DirectClass 5.27KB 0.000u 0:00.000
【5】删除文件的某一列(awk)
#source file train.txt
ARCHIVE B1_NAME B2_NAME B3_NAME ELEMENT INFO_NAM WERT PROCID
-------- -------- -------- -------- -------- -------- ---- ------
15MinAvg AIRSS 33-GIS DMDMGIS1 I MvAvr15m 1123 CP
15MinAvg AIRSS 33-GIS DMDMGIS1 P MvAvr15m 2344 CP
15MinAvg AIRSS 33-GIS DMDMGIS1 Q MvAvr15m 4545 CP
15MinAvg AIRSS 33-GIS DMDMGIS2 I MvAvr15m 6576 CP
15MinAvg AIRSS 33-GIS DMDMGIS2 P MvAvr15m 4355 CP
15MinAvg AIRSS 33-GIS DMDMGIS2 Q MvAvr15m 6664 CP
# 实际上,假如删除第二列,那么就是不打印第二列即可,然后输出整个文件
awk '{$2="";print $0}' train.txt > result.txt
#result.txt
ARCHIVE B2_NAME B3_NAME ELEMENT INFO_NAM WERT PROCID
-------- -------- -------- -------- -------- ---- ------
15MinAvg 33-GIS DMDMGIS1 I MvAvr15m 1123 CP
15MinAvg 33-GIS DMDMGIS1 P MvAvr15m 2344 CP
15MinAvg 33-GIS DMDMGIS1 Q MvAvr15m 4545 CP
15MinAvg 33-GIS DMDMGIS2 I MvAvr15m 6576 CP
15MinAvg 33-GIS DMDMGIS2 P MvAvr15m 4355 CP
15MinAvg 33-GIS DMDMGIS2 Q MvAvr15m 6664 CP
【6】有的时候我们希望按照文件名来排序。 用到 ls 与sort
ls -l |sort -k9 -n
#注:我们文件名一般是ls的第九个字段。然后按照大小(-n)排序输出
# 也有的时候文件名是文字加字符串组成的,如:
`
sample_1978.jpg
sample_1979.jpg
sample_1980.jpg
sample_1981.jpg
`
# 此时可以使用-t 选项 指定分隔符,对分割后的指定列进行排序
ls *.jpg |sort -t '_' -k2 -n
【7】批量重命名文件
可以使用rename ,如果mac下没有可以 brew install rename
cat list.txt |while read line
do
rename 's/old/new/' $line #注意最后一个/
done
或者你的文件夹下所有文件都有共有的部分(rea),可以一句话解决
rename 's/old/new_string/' *rea*
【8】求文件某一列均值,列默认用空格切分
awk '{for(i=1;i<=NF;i++){a[i]+=$i}}END{for(i=1;i<=NF;i++)print a[i]/NR}' input_file
【9】shell 删除文件中的所有空格
sed 's/[[:space:]]//g' input_file
实现两个数据map之间的重命名与cp 主要指令:{sed}
i=0
cat srcdata.list|while read line
do
i=`expr $i + 1`
imageName=`sed -n ${i}p list.txt`
echo $imageName
cp $line ./srcData/$imageName
done
#其中 srcdata.txt 与list.txt 中每行文件一一对应
/Users/bingolwang/workspace/2018-04/ssd/data/*3941526227979.jpg
/Users/bingolwang/workspace/2018-04/ssd/data/*3949300842120.jpg
/Users/bingolwang/workspace/2018-04/ssd/data/*3832091085853.jpg
...
0.jpg
1.jpg
10.jpg
...
【10】如何查询空文件,并删除
ll JPEGImages/|sort -n -k 5 > nn.txt
vim 中跳到20行 :20
vim 中跳到某行的第20个字符 20l (l==left)
行首:^ 行尾: $
#-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
在vimrc中设置{ 自动补全,可以设置映射:(说白了就是输入{,自动映射成{} ,同时加tab)
inoremap <buffer> { {}<left><CR><CR><Up><Tab>
inoremap ( ()<ESC>i
inoremap [ []<ESC>i
sed: -e expression #1, char 0: unmatched `{' #主要原因是对sed进行了传参,且使用了单引号
1、从3行取到行尾 sed -n "3,$p" test.txt #
2、cer=12
tty=34
sed -n ${cer},${tty}p test.txt #截取12行到34行之间的内容
sed -n "${cer},${tty}p" test.txt #等效上一条,只不过加了双引号
这个指令有的时候需要在脚本中用到。
3、删除满足条件的行
sed '/-1/d' input_list.txt
# 删除含有 -1 的行
1、 去除某个文件的空行,实际上就是把有内容的行打印
awk NF input_list.txt
2、 根据某一列的属性,取出对应行
cat list.txt |while read line
do
cat $line |awk '{if ($6 ==2){print $1}}'
done
【1】压缩解压 tar
c – 创建压缩文件
x – 解压文件
v – 显示进度. #z –通过gzip归档
f – 文件名. #j – 通过bzip2归档
将 /home/bin.wang/code 压缩 tar.gz 格式的包
tar cvzf code.tar.gz /home/bin.wang/code
解压
tar -xvf code.tar.gz OR tar -xvf code.tar.bz2
file : server -> local 用sz命令 回车
file : local -> server 用rz -bye 回车
以 imagemagic为例:
首先下载 imagemagic源码。 http://www.imagemagick.org/script/install-source.php
然后 解压 tar xvzf ImageMagick.tar.gz 然后 cd ImageMagick-7.0.6
然后 ./configure --prefix=/your/path/to/install
然后 make 然后 make install 然后 /your/path/to/install这个文件夹下就会有
对应的bin目录。其中放了一些可执行文件。
下面,我们需要打开 ~/.bashrc 加入 export PATH=$PATH:/your/path/to/install/bin
然后 source ~/.bashrc 即可。
这里提一句一般使用源码安装,大都是在自己没有sudo权限的情况下,因此需要设置安装路径。--prefix=***
linux 下分析一个可执行文件所需要的动态链接库:ldd **.bin
mac 下有个对应的工具(千万别自己手装 brew install ldd):otool -L **.bin
1、首先保证我们的代码是从服务器上pull 下来的。(也就是得有.git 目录)
2、然后 将我们需要更新的文件 git add path/your/file
或者git add .
3、然后 为更改的文件添加说明: git commit -m "some message for your changing"
4、然后 git push
1、想切到原始分支怎么办?
git log
查看原始代码的hash code
然后 git checkout hashCode 即可
2、使用merge request,我们很多时候开发是没有权限再master上提交代码的,此时可以建一个分支,然后将分支提一个
request,但是有时候,我只想合并我dev分支的最新一个commit的代码,这时候需要先从主分支 check出来一个新分支temp,
然后再新的分支上,修改代码,再提交merge request
3、 如何删除本地分支?
git branch -d dev 删除了本地dev分支
4、如何删除远程分支?
git push origin -d dev 删除远程分支dev
出现这个情况:可能是 我们曾经执行过 git checkout commit_id(一大串16进制数字:e8ecfce...)
#原因:我们切到了一个无名的分支,导致我们的head指针处于游离状态。
解决:可以git branch dev commit_id(是刚才的那个一串数字e8ecfce...)
这样就创建了一个 名为dev的分支。 其commit_id是 e8ecfce...
#然后,切到master
git checkout master
#然后,在 master合并dev中的修改
git merge dev
此时,就可以执行 git push
结论:
最终可以看到有两个分支:【dev】 与 【master】
命令为:git branch
【1】HEAD指向的版本就是当前版本(不一定是master 分支),因此,Git允许我们在历史版本中切换,
指令为: git reset - -hard commit_id
【2】git log可以查看提交历史,以便确定要回退到哪个版本。
【3】要重返未来,git reflog查看命令历史,以便确定要回到哪个版本
[重返未来:指的是原来去过,现在在回去]
###7.3、我们在clone的时候往往需要
git clone --recursive path/to/project.git # 加上--recursive 好处是可以将submodel的递归下载。不加则不下载
git merge master temp #将temp的改动合并到master上。
前提是 temp改动过的文件master一定不能动。否则产生冲突。
ls |grep .jpg > list.txt
dos2unix *.txt
> result.txt
cat list.txt |while read line
do
echo $line >> result.txt
varw=`echo $line | awk -F . '{print $1}'` # varw得到了切割结果
sed -i "" '/^$/d' ${varw}.txt # 删除Linux下的空行
cat ${varw}.txt >> result.txt
echo " " >> result.txt
done
recursive_print_file.sh
#!/bin/bash
function readfile()
{
for file in `ls $1`
do
if [ -d $1"/"$file ]
then
readfile $1"/"$file # recursive algorithm
else
echo $1"/"$file # or do somthing
fi
done
}
readfile $1 # $1 是shell脚本输入的第一个参数, $2,$3 一次类推, $* 是输入所有参数
假设我有这样一个文件夹
test
├── a
│ ├── dd.txt
│ ├── e
│ │ └── w.txt
│ ├── f
│ │ └── er.txt
│ ├── ff.txt
│ └── g
├── b
└── c
├── 45.txt
├── er
│ └── w.txt
└── tt.txt
执行 sh recursive_print_file.sh test
结果输出为:
test/a/dd.txt
test/a/e/w.txt
test/a/f/er.txt
test/a/ff.txt
test/c/45.txt
test/c/er/w.txt
test/c/tt.txt
find . -print |xargs rm
find . -print 可以递归打印路径文件,以当前文件为基准。
rm -rf soft_link_name 千万别删除 soft_link_name/ 因为那个会删除原始文件
#generate result:test.txt trainval.txt
#for each line of *txt should be formated as follows:
#VOC2007/JPEGImages/23514_train_image.jpg VOC2007/Annotations/23514_train_image.xml
ls JPEGImages |grep .jpg > image_list.txt
img_cnt=`wc -l image_list.txt`
echo "total $img_cnt images ..."
sort -R image_list.txt > image_list.txt.r
rm image_list.txt
sort -R image_list.txt.r > image_list.txt
sed 's/.jpg/.xml/g' image_list.txt > xml_list.txt
sed -i 's/^/VOC2007\/JPEGImages\//g' image_list.txt
sed -i 's/^/VOC2007\/Annotations\//g' xml_list.txt
paste image_list.txt xml_list.txt --delimiters=" " > all_result.txt
sed -n '1,400p' all_result.txt >test.txt
sed -n '401,$p' all_result.txt > trainval.txt
rm image_list.txt image_list.txt.r xml_list.txt all_result.txt