Linux 下shell、vim、git中 trick

1、Shell trick for processing text

【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

1.1 shell 如何取到文本最后一列

答: awk '{print $NF}'

1.2 shell 如何判断某个文本文件是否包含某个特定字符串

答: 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 中每行文件一一对应
  • 其中srcdata.list中的内容为
/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
...
  • 其中list.txt 中的内容为
0.jpg
1.jpg
10.jpg
...

【10】如何查询空文件,并删除
ll JPEGImages/|sort -n -k 5 > nn.txt

2、vim trick

vim 中跳到20行  :20
vim 中跳到某行的第20个字符  20l  (l==left)
行首:^  行尾: $
#-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
在vimrc中设置{ 自动补全,可以设置映射:(说白了就是输入{,自动映射成{} ,同时加tab)
inoremap <buffer> { {}<left><CR><CR><Up><Tab>
inoremap ( ()<ESC>i
inoremap [ []<ESC>i

【About sed】

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 的行

【About awk】

1、 去除某个文件的空行,实际上就是把有内容的行打印  
awk NF input_list.txt
2、 根据某一列的属性,取出对应行
cat list.txt |while read line
do
        cat $line |awk '{if ($6 ==2){print  $1}}'
done

3、Shell trick for file processing

【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

4、Shell cmd for file transfering

file : server -> local 用sz命令  回车
file : local -> server 用rz -bye 回车

5、Install software form source

以 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=***

6、Analysis dynamic library (mac& linux)

linux 下分析一个可执行文件所需要的动态链接库:ldd **.bin  
mac 下有个对应的工具(千万别自己手装 brew install ldd):otool -L **.bin 

7、using git in Linux or OSX

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


7.1、git HEAD detached from ** **** 解决办法

出现这个情况:可能是 我们曾经执行过 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 

7.2、关于git几句重要的话

【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的递归下载。不加则不下载

7.4、合并分支

git merge master temp #将temp的改动合并到master上。
前提是 temp改动过的文件master一定不能动。否则产生冲突。

8. some useful shell scripts

  • 以下是我工作中常用的脚本
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
  • shell脚本递归遍历文件夹 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 可以递归打印路径文件,以当前文件为基准。

8.1删除软连接

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
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值