1. 程式人生 > >shell指令碼 檔案合併

shell指令碼 檔案合併

1.有兩個檔案,每個檔案中有一列,把這兩個檔案中的列合併到一個檔案中形成兩列
普通shell指令碼:
paste -d "\t" eng.txt chi.txt
awk:
awk 'NR==FNR{a[i]=$0;i++}NR>FNR{print a[j]" "$0;j++}' eng.txt chi.txt  

檔案內容如下:
more eng.txt chi.txt 
::::::::::::::
eng.txt
::::::::::::::
semicolon
comma
delimiter
spacebar
hyphen
single quote
double quote
::::::::::::::
chi.txt
::::::::::::::
分號
逗號
定界符
空格鍵
連字元號
單引號
雙引號
方法1、paste -d "\t" eng.txt chi.txt 

semicolon       分號
comma   逗號
delimiter       定界符
spacebar        空格鍵
hyphen  連字元號
single quote    單引號
double quote    雙引號
方法2、或者使用awk來處理
awk 'NR==FNR{a[i]=$0;i++}NR>FNR{print a[j]" "$0;j++}' eng.txt chi.txt 
semicolon 分號
comma 逗號
delimiter 定界符
spacebar 空格鍵
hyphen 連字元號
single quote 單引號
double quote 雙引號
hash 井號


2. 字串操作

Linux 的字串擷取很有用。有八種方法。
假設有變數 var=http://www.hao.com/123.htm
 
2.1 # 號擷取,刪除左邊字元,保留右邊字元。
 
echo ${var#*//}
其中 var 是變數名,# 號是運算子,*// 表示從左邊開始刪除第一個 // 號及左邊的所有字元
即刪除 http://
結果是 :www.hao.com/123.htm
 
2,2 ## 號擷取,刪除左邊字元,保留右邊字元。
echo ${var##*/}
##*/ 表示從左邊開始刪除最後(最右邊)一個 / 號及左邊的所有字元
即刪除 http://www.hao.com/          
結果是 123.htm


 
2.3 %號擷取,刪除右邊字元,保留左邊字元
echo ${var%/*}
%/* 表示從右邊開始,刪除第一個 / 號及右邊的字元
結果是:http://www.hao.com


2.4 %% 號擷取,刪除右邊字元,保留左邊字元
echo ${var%%/*}
%%/* 表示從右邊開始,刪除最後(最左邊)一個 / 號及右邊的字元
結果是:http:


 
2.5 從左邊第幾個字元開始,及字元的個數
echo ${var:0:5}
 
其中的 0 表示左邊第一個字元開始,5 表示字元的總個數。
結果是:http:


2.6 從左邊第幾個字元開始,一直到結束。
echo ${var:7}
其中的 7 表示左邊第8個字元開始,一直到結束。
結果是 :www.hao.com/123.htm
.
.
 
2.7 從右邊第幾個字元開始,及字元的個數
echo ${var:0-7:3}
 
其中的 0-7 表示右邊算起第七個字元開始,3 表示字元的個數。
結果是:123
.
.
 
2.8 從右邊第幾個字元開始,一直到結束。
echo ${var:0-7}
表示從右邊第七個字元開始,一直到結束。
結果是:123.htm


注:(左邊的第一個字元是用 0 表示,右邊的第一個字元用 0-1 表示)




3. 按相同列合併兩個檔案

 Join
   這裡有兩個檔案file1和file2,當然已經分類。每個檔案裡都有一
些元素與另一個檔案相關。由於這種關係, join將兩個檔案連在一起,這有點像修改一個主文
件,使之包含兩個檔案裡的共同元素。文字檔案中的域通常由空格或tab鍵分隔,但如果願意,可以指定其他的域分隔符。


檔案names:
M.Golls 12 Hidd Rd
P.Heller The Acre
P.Willey 132 the Grove
T.Norms 84 Connaught Rd
K.Fletch 12 Woodlea


檔案towm:
M.Golls Norwich NRD
P.Willey Galashiels GDD
T.Norms Brandon BSL
K.Fletch Mildenhall MAF
kkkkkkkkkkkkkk


[email protected]:~/code/shell/sort$ join names towm 
M.Golls 12 Hidd Rd Norwich NRD
P.Willey 132 the Grove Galashiels GDD
T.Norms 84 Connaught Rd Brandon BSL
K.Fletch 12 Woodlea Mildenhall MAF
合併兩個檔案。預設的是按照第一域進行合併。

相關推薦

shell指令碼 檔案合併

1.有兩個檔案,每個檔案中有一列,把這兩個檔案中的列合併到一個檔案中形成兩列普通shell指令碼:paste -d "\t" eng.txt chi.txtawk:awk 'NR==FNR{a[i]=$0;i++}NR>FNR{print a[j]" "$0;j++}

一個小坑: -bash: ./backup.sh: /bin/bash^M: bad interpreter: No such file or directory 由於shell指令碼檔案被我在Windows下編輯過,出現上面錯誤的原因之一是指令碼檔案是DOS格式的, 即每一行的行尾以\r\n來標識

    由於shell指令碼檔案被我在Windows下編輯過,出現上面錯誤的原因之一是指令碼檔案是DOS格式的, 即每一行的行尾以\r\n來標識, 使用vim編輯器開啟指令碼, 執行::set ff? 可以看到DOS或UNIX的字樣. 使用se

編寫第一個shell指令碼檔案

vi test.sh 這樣就新建了一個名為test.sh的指令碼檔案,之後按i進入編輯模式,輸入以下內容: echo "What is your name?" read PERSON echo "Hello, $PERSON" 按esc鍵退出編輯模式,再輸

shell指令碼檔案中for迴圈的兩種寫法

#!/bin/bash for (( i = 0; i <= 10; i++ )) ; do echo "The value is: $i" done echo -e "\nJourneys end in lovers' meeting."

shell指令碼檔案檢視使用者目錄下的某類檔案

檢視使用者目錄下的以.bash開頭的檔案 #!/bin/bash for FILE in $HOME/.bash* do echo $FILE done 先在使用者目錄下建立一個指令碼檔案:touch bas.sh,再開啟這個檔案:open bas.

awk執行的三種方式,以及awk以shell指令碼檔案形式執行的注意事項

awk執行有三種形式: 1.直接以命令列來執行,如圖: 2.以awk指令碼檔案來執行 需要加-f選項。 3.以shell指令碼的形式來執行         以shell指令碼形式執行時,行首的#!/bin/bash 需變換為#!/bin/awk(awk所在的路徑

Shell指令碼檔案練習

使用if條件語句來判斷/media/cdrom檔案是否存在,若存在就結束條件判斷和整個Shell指令碼,反之則去建立這個目錄: vim mkcdrom.sh #!/bin/bash DIR="/media/cdrom" if [ ! -e $DIR ] then

如何在客戶端上傳shell指令碼檔案,並利用PHP呼叫執行指令碼

題目中的上傳包含兩部分,一部分是上傳檔案,一部分是利用PHP執行指令碼 上傳檔案到指定資料夾 所謂檔案上傳是指將本地文字檔案,圖片視訊或者音訊等檔案上傳到伺服器上,以供後續操作的過程。 上傳檔案有幾種方式,包括: - 單純的form表單上傳提交 使

編寫shell指令碼檔案來批量執行labelme_json_to_dataset

總結: 主要有三個點要把握好: 1.shell的語法(這個網上資料很多) 2.labelme轉化時候要啟用自己安裝labelme的anaconda環境,要不然就找不到labelme_json_to_dataset 3.出現Bad for loop variable不是

利用Oracle DBMS_SCHEDULER呼叫shell指令碼檔案

今天在itpub上看到個帖子,大意是使用shell指令碼取檔案列表,和資料庫中一個表中記錄的檔名相比較,沒有的插入到表裡去。實驗程式碼如下:#建立檔案filelist.sh如下: #!/bin/bash

[shell]如何跨shell指令碼檔案呼叫函式

問題背景        在寫shell程式碼的過程中,遇到一件低效率的事情。寫三個日誌列印函式,在很多檔案中很多次使用。但是不想每個檔案都定義一次。比如程式碼如下:function LOG_NOTICE() { echo -e "\033[34m${1}\03

shell指令碼檔案重定向讀取.csv檔案,輸出SQL Insert語句

檔案重定向常見於指令碼需要讀入檔案和輸出檔案時。這個樣例指令碼兩件事都做了。它讀取.csv 格式的資料檔案,輸出SQL INSERT語句來將資料插入資料庫。 shell指令碼使用命令列引數指定待讀取的.csv檔案。.csv格式用於從電子表格中匯出資料,所以 你可以把資料庫資料放入電子表格中,把電子表

SQL資料庫基本操作對應Shell指令碼檔案處理

一、前言 日常工作中,一些資料統計的源資料是檔案,因為檔案資料統計不像資料庫操作那樣方便,如果匯入資料庫再進行操作,可能比較麻煩;因此,這裡將SQL資料庫基本操作與Shell對檔案資料操作進行對應,方便用Shell的語法進行檔案處理。這裡分別用Oracle SQL與shel

Linux Shell指令碼檔案的判斷、中文符號及其字串入參解析

1、shell指令碼中判斷檔案是否存在 if [ -f  "$var" ] then...... 2、shell指令碼中判斷字串為空  if [ -z "$str"] then...... 3、shell指令碼中判斷字串不為空 if[ "$str"] then..... 4、字串入參的注意事項      

shell指令碼 顯示檔案大小 顯示執行時間

顯示大小 echo $file size=`stat -c "%s" $file` 顯示執行時間 starttime=`date +'%Y-%m-%d %H:%M:%S'` endtime=`date +'%Y-%m-%d %H:%M:%S'` start_seconds

shell指令碼限制日誌檔案大小和行數

背景: 專案server在後端持續執行,日誌檔案不斷變大,需及時進行清空。 解決方案:編輯sh指令碼,指定時間間隔輪詢;將超出限制的日誌檔案,先備份,再清空原日誌檔案內容。 清空日誌檔案內容的方法有:             1

Linux系統下編寫shell指令碼傳入引數列印系統當前執行緒數到指定檔案

  最近在做效能測試,要檢視系統執行過程中執行緒數,很簡單輸入命令:netstat -anp |grep java |wc -l,可以查詢。但是如何在執行過程定時列印系統執行緒數且將結果輸出到指定檔案呢?也很簡單我們直接寫一個shell指令碼執行下就可以了。以

shell 指令碼替換檔案中的某個字串

1、將當前目錄下包含"qwe"串的檔案中的"qwe"字串替換為"abc" sed -i “s/qwe/abc/g” grep "qwe" -rl ./ 2、將某個檔案中的"qwe"字串替換為"abc" sed -i “s/qwe/abc/g” test.txt 如果將某個檔案

shell指令碼實現檔案改名/重新命名

  shell指令碼實現檔案改名小操作, 在此做一記錄. #!/bin/bash #將資料檔案.SAC名改為'<sta>.[N/E/Z].SAC' #例如2014.143.20.49.21.0000.YN.BAS.00.BHE.M.SAC改為BAS.E.SAC cd ..

Linux Shell 指令碼讀取配置檔案

一、應用場景 為了靈活應用shell指令碼,適當的加入配置檔案,對於後期的維護和優化會有很大幫助。例如指令碼中使用的檔案/檔案路徑,都可以通過讀取配置檔案完成。 配置檔案 filename=boomlee 指令碼檔案 #!/bin/bash workdir=$(cd $(di