2017-08-09 80 views
0

我有一個文件myfile.txt中如何通過UNIX來連接線命令

"field1","val1","val2","val3" 
"field2","val1","val2","val3" 
"field3","val1","va 
    l2","va 
    l3" 
"field4","val1","val2","val3" 

我想做這個文件中這樣的普通視圖:

"field1","val1","val2","val3" 
"field2","val1","val2","val3" 
"field3","val1","val2","val3" 
"field4","val1","val2","val3" 

所以,我試圖做用下一個命令:

filename=myfile.txt 

while read line 
do 
    found=$(grep '^[^"]') 
    if [ "$found" ]; then   
     #think here must be command "paste"  
    fi 
done < $filename 

但是有什麼不對。請幫我,我不是大師在UNIX命令

+1

請勿在'grep'的正則表達式周圍放置'//'分隔符。 – Barmar

+0

'awk'會是更好的方法。如果該行不以''結尾,請閱讀下一行並連接它。 – Barmar

+0

@Barmar編輯了unix命令,但現在我發現只有1行 –

回答

1

試試這個:

filename=$1 

while read -r line 
do 
    found=$found$(echo $line | grep '[^"]') 
    if [[ -n $found && $found == *\" ]]; then 
     echo $found; 
     found='' 
    fi 
done < "$filename" 
  1. 變量$found總是附加到自己這樣你會加入「虛線」。
  2. 在如果它然後檢查是否$found不爲空(-n就是這樣做的),然後檢查是否$found通過@Barmar

的建議如果它以一個報價是這樣的結束而終止以引號結束所以你echo $found變量設置空

+0

謝謝,但現在是問題如何連接? –

+0

引用你的變量 – Barmar

+0

@AndreyKhmelev以'found ='開頭的行連接 – Barmar

1

的sed解決方案:

sed -Ez 's/[[:space:]]+//g; s/""/","/g; s/(([^,]+,){3})([^,]+),/\1\3\n/g; $a\\' myfile.txt 
  • -z - 處理輸入作爲通過空分離線(零)字符而不是換行符

  • s/[[:space:]]+//g - 刪除之間的空格/線內

  • s/""/","/g - 分離相鄰的字段,其被包裹/ breaked

  • s/(([^,]+,){3})([^,]+),/\1\3\n/g - 每個第四字段換行符(記錄分隔符)設置

  • $a\\ - 追加最終換行符在內容結束


輸出:

"field1","val1","val2","val3" 
"field2","val1","val2","val3" 
"field3","val1","val2","val3" 
"field4","val1","val2","val3" 
+0

您可以在您的解決方案的工作方式上添加評論 –

+0

@anvitasurapaneni,查看我的解釋 – RomanPerekhrest

+0

非常清楚..謝謝:) –

0

不知道在輸入字段數,你可以使用這個GNU的awk的解決方案使用FPATgensub

awk -v RS= -v FPAT='("[^"]*"|[^,"]+),?' -v OFS= '{ 
     for (h=1; h<=NF; h++) $h = gensub(/([^"])\n[[:blank:]]*/, "\\1", "g", $h); } 1' file 

"field1","val1","val2","val3" 
"field2","val1","val2","val3" 
"field3","val1","val2","val3" 
"field4","val1","val2","val3" 

要將更改保存迴文件,請使用:

awk -i inplace -v RS= -v FPAT='("[^"]*"|[^,"]+),?' -v OFS= '{ 
     for (h=1; h<=NF; h++) $h = gensub(/([^"])\n[[:blank:]]*/, "\\1", "g", $h); } 1' file