2014-02-13 76 views
0

我有一個input.txt包含這樣的Unix命令切斷文件並重新創建新的

123 

1234 

1223 

我希望它轉換成其他文件output.txt和文件應該是這樣的

'123','1234','1223' 

數據你可以讓我告訴我它是如何在unix中完成的嗎?

+0

輸入中每行數據之間是否真的有空行? –

回答

0

你可以使用sed

cat input.txt | sed -n "s!\(.*\)!'\1'!;H;\$!b;x;s!^\n!!;s!\n!,!g;p" 

閱讀(默認情況下不打印-p)每一行,然後將其附加到保留空間H - 然後停除了最後一個\$b所有行。 在最後一行 - 將保留空間複製到模式空間x中,排第一個換行符(保留空間中有換行​​符開頭),然後用','替換其餘換行符。最後打印出圖案空間p

你可以使用一個Perl腳本

#!/usr/bin/perl 

my @lines = <>; 
chomp(@lines); 
print join(',', map { "\"$_\"" } @lines), "\n"; 

./script input.txt 
+0

非常感謝Beano :) ...但我正在尋找在UNIX命令 – user3305824

+0

更新的答案給出一個sed替代 – Beano

2

你可以試試這個,

tr -s '\n' < input.txt | sed "s/.*/'&'/g" | tr '\n' ',' | sed 's/,$//g' > output.txt 
+0

非常感謝兄弟.......「坐」你的男人 – user3305824

+0

最後一個sed可以只是's /,$ //' – Beano

+0

@Beano,是的。更新了答案。 – sat

0

恐怕我不能與你的bash。試試這在Python:

InputFilepath = /path/to/input.txt 
OutputFilepath = /path/to/output.txt 

with open(InputFilepath, "r") as f: 
    words = f.read().splitlines() #may be not needed? 
    result = ','.join(f) 

with open(OutputFilepath, "w") as g: 
    g.write(result) 
0

我敢打賭,有一個更乾淨的方式來做到這一點,但不能想象到目前爲止。

#   1   2       3    4 
sed "/^[ \t]*$/d; s/\(.*\)/'\1'/" input.txt | tr "\n" "," | sed 's/,$//' 
  1. 除去坯線(包括含有空格/製表符線)。
  2. 添加單引號在每行
  3. 用逗號
  4. 刪除尾隨更換新線,
0

這裏是一個awk版本

awk 'NF{s=s q$0q","} END {sub(/,$/,x,s);print s}' q="'" file 
'123','1234','1223' 

它是如何工作的:

awk ' 
NF {    # When line is not blank, do: 
    s=s q$0q","} # Chain together all data with ' before and ', 
END {    # End block 
    sub(/,$/,x,s) # Remove last , 
    print s}  # Print the result 
    ' q="'" file # Helps awk to handle single quote in print, and read the file 
0

隨着GNU awk的用於多炭RS:

$ awk -v RS='\n+$' -v FS='\n+' -v OFS="','" -v q="'" '{$1=$1; print q $0 q }' file 
'123','1234','1223' 

它只是讀取整個文件作爲一個記錄(RS='\n+$')鄰接換行符作爲輸入字段分隔符(FS='\n+')的使用序列然後重新編譯使用','作爲記錄輸出字段分隔符(OFS="','")通過爲自己分配一個字段($1=$1),並在前面和後面打印結果與'

相關問題