我有一個input.txt
包含這樣的Unix命令切斷文件並重新創建新的
123
1234
1223
我希望它轉換成其他文件output.txt
和文件應該是這樣的
'123','1234','1223'
數據你可以讓我告訴我它是如何在unix中完成的嗎?
我有一個input.txt
包含這樣的Unix命令切斷文件並重新創建新的
123
1234
1223
我希望它轉換成其他文件output.txt
和文件應該是這樣的
'123','1234','1223'
數據你可以讓我告訴我它是如何在unix中完成的嗎?
你可以使用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
非常感謝Beano :) ...但我正在尋找在UNIX命令 – user3305824
更新的答案給出一個sed替代 – Beano
你可以試試這個,
tr -s '\n' < input.txt | sed "s/.*/'&'/g" | tr '\n' ',' | sed 's/,$//g' > output.txt
恐怕我不能與你的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)
我敢打賭,有一個更乾淨的方式來做到這一點,但不能想象到目前爲止。
# 1 2 3 4
sed "/^[ \t]*$/d; s/\(.*\)/'\1'/" input.txt | tr "\n" "," | sed 's/,$//'
這裏是一個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
隨着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
),並在前面和後面打印結果與'
。
輸入中每行數據之間是否真的有空行? –