2017-09-02 74 views
-3
~1 
ACCOUNT1 
34765367 
001 
5637463648374 
1 
32476743 
85468456875 
003 
~1 
~2 
ACCOUNT2 
23587458745647 
1 
002343 
2347938457 
~2 

將其打印成列.... SO ON我有一個文本文件,在下面的格式,我想用shell腳本

我想把它打印到另一個文件中的格式如下:

ACCOUNT134765367001563746364837413247674385468456875003 
ACCOUNT22358745874564710023432347938457 

我已經寫了類似下面這樣的東西,直到〜9完美,但是~10它也將〜10記錄添加到〜1記錄,在〜1記錄的末尾。我想我需要更新我的正則表達式...請幫助

max_input=2 
path1=/home 
line_number_m=1 
while [ ${line_number_m} -le ${max_input} ] 
do 
o_p="" 
sed -n "/^${line_number_m},/^~{line_number_m}/p" ${path1}/temp_op.txt | sed 
"s/^${line_number_m}//" > ${path1}/tmp.txt 
while read val 
do 
if [ -z ${val} ] 
then 
continue 
else 
o_p=`echo ${o_p}``echo ${val}` 
fi 
done< ${path1}/tmp.txt 
echo ${o_p} >>${path1}/tmp_output.txt 
line_number_m=`expr ${line_number_m} + 1` 
done 
rm ${path1}/tmp.txt 
tail -n +2 ${path1}/tmp_output.txt > ${path1}/output.txt 
rm ${path1}/tmp_output.txt 
exit 0 

內部〜1〜1可以是任何隨機數或字符,甚至空間,如下面的記錄: 〜1 COMMON --2space --- 3空間 --5spaces --- 〜1

我想我的輸出象下面這樣: 00113324324343COMMON6487364754557465--5874654657 --- 485678465744568746574657 -----

+1

請讓我們知道[你嘗試過的](http://whathaveyoutried.com/)。我們大多數人都很樂意幫助你改進自己的技藝,但不願意擔任短期無償編程人員。在[MCVE](http://stackoverflow.com/help/mcve)中向我們展示您的工作,您期待的結果以及您獲得的結果,我們將幫助您弄清楚。 – ghoti

+0

我已經嘗試過上面的代碼。有2個問題。首先是當我傳遞1到10條記錄時,追加〜1和〜10記錄,而第二條記錄是否不考慮空格鍵記錄。 – user8552135

回答

1

試用一下這個,希望能幫助你爲起點:

#!/bin/bash 

while IFS='' read -r line || [[ -n "$line" ]]; do 
    if [[ $line == ACCOUNT* ]] 
    then 
     printf '\n%s' "$line" 
    elif [[ $line != ~* ]] 
    then 
     printf '%s' "$line" 
    fi 
done < "$1" 

保存到一個文件中,並嘗試:

./script.sh data.txt 

還要檢查這個答案:https://stackoverflow.com/a/2172367/1135424

# The == comparison operator behaves differently within a double-brackets 
# test than within single brackets. 

[[ $a == z* ]] # True if $a starts with an "z" (wildcard matching). 
[[ $a == "z*" ]] # True if $a is equal to z* (literal matching). 
+0

請注意,如果您運行了一個腳本,並指定了'#!/ bin/sh',那麼(1)不保證使用bash,並且(2)即使它使用bash,也會運行POSIX兼容模式,不包括'[[''。哦,而且,如果輸入數據包含可解釋爲格式的百分比字符,則您的'printf'將失敗。 – ghoti

+0

@ ghoti感謝您指出了這一點。 – nbari

+0

沒問題。順便說一句,解決其他問題的方法是'printf'%s'「$ line」'。 – ghoti

1

對我來說更容易在gawk或awk而不是sed中。 Awk已經處理記錄,所以它特別擅長這樣的任務。你只需要告訴它如何識別記錄分隔符,以及你想要對字段做什麼。在這種情況下,在偶數編號的記錄中,我們刪除所有空格,然後打印。

gawk -v RS='~[0-9]+' 'NR%2==0 {gsub(/[[:space:]]/,"");print}' 

這個依賴的gawk功能是複雜的(正則表達式)RS變量。在BSD或者MacOS,你可能需要像下面這樣,倒空的記錄連接所有的字段前的第一場:如果你真的想這樣做,在SED

awk -v RS='~' 'NR%2==0 {$1="";gsub(/[[:space:]]/,"");print}' 

,我認爲你可以掰過來與類似以下內容:

sed -Ene $'H;${x;s/[[:space:]]//g;s/~[0-9]+A/\\\nA/g;s/~[0-9]*//g;p;}' 

這使得整個文件進貨艙空間,做同樣的空白減排爲awk腳本,然後重新添加換行符清除出你的領域分離的過程。

0

流水線:

$ sed '/^~/d' data | tr -d '\n' | sed -re 's/(.)A/\1\nA/g' -e 's/$/\n/' 
ACCOUNT134765367001563746364837413247674385468456875003 
ACCOUNT22358745874564710023432347938457 
  • 第一sed刪除所有開始的行~
  • tr將所有內容連接成一行輸出。
  • 最後sed使用字符A(的ACCOUNT)作爲分隔符再次將輸入切分爲單獨的行,並在末尾添加換行符。

最後sed需要GNU sed能夠與\n插入新行。

+0

爲了記錄,如果你的shell支持格式擴展,你仍然可以在sed中插入換行符,使用如下所示:'-e $'s/$/\\\ n /''。 – ghoti

0
$ sed '/^~/d' data | awk -v RS='A' -v OFS='' '$1 && $1=RS $1' 
ACCOUNT134765367001563746364837413247674385468456875003 
ACCOUNT22358745874564710023432347938457 

這是我對這個問題的第二個解決方案。

它以sed開頭,刪除所有以~開頭的行。

awk然後讀取其餘數據作爲由字符A分隔的記錄,並在輸出它們之前連接字段(不帶分隔符)。

這不依賴於GNU工具。

0

這可能爲你工作(GNU SED):

sed -rn '/^~/{:a;N;/^(~[0-9]+)\n(.*)\n\1$/!ba;s//\2/g;s/\s//g;p}' file 

收拾起來連續的分隔符,即行之間的行開始~n其中n爲整數。去除分隔符,去除空白並打印。

相關問題