我在那里,我有一個這樣的文本檔案:
Viruses/GCF_000820355.1_ViralMultiSegProj14361_genomic.fna.gz
Sclerophthora macrospora virus A
Viruses/GCF_000820495.2_ViralMultiSegProj14656_genomic.fna.gz
Influenza B virus RNA
Viruses/GCF_000837105.1_ViralMultiSegProj14079_genomic.fna.gz
Tomato mottle virus
我需要得到這樣的檔案:
Viruses/GCF_000820355.1_ViralMultiSegProj14361_genomic.fna.gz,Sclerophthora macrospora virus A
Viruses/GCF_000820495.2_ViralMultiSegProj14656_genomic.fna.gz,Influenza B virus RNA
Viruses/GCF_000837105.1_ViralMultiSegProj14079_genomic.fna.gz,Tomato mottle virus
因為后者我想像元組一樣使用它來查找壓縮檔案,讀取它并獲得一個名稱如下的最終檔案:
Viruses/GCF_000837105.1/Tomato mottle virus.fna
我只需要學習如何解決問題的第一部分。它可以通過 sed/awk/R/Python。任何幫助將不勝感激。這對我來說很難完成,因為原始檔案名非常混亂。
謝謝大家的時間。
保羅
PS-我試過這個:
sed -z 's/\n/,/g;s/,$/\n/' multi_headers
但是,它在所有 \n 中都添加了逗號。
uj5u.com熱心網友回復:
在每個 Unix 機器上的任何 shell 中使用任何 awk,并且一次只在記憶體中存盤 1 行,因此無論您的輸入檔案有多大,它都可以作業:
$ awk '{ORS=(NR%2 ? "," : RS)} 1' file
Viruses/GCF_000820355.1_ViralMultiSegProj14361_genomic.fna.gz,Sclerophthora macrospora virus A
Viruses/GCF_000820495.2_ViralMultiSegProj14656_genomic.fna.gz,Influenza B virus RNA
Viruses/GCF_000837105.1_ViralMultiSegProj14079_genomic.fna.gz,Tomato mottle virus
在上面的少量代碼中發生了很多事情,所以這里有一個解釋:
ORS是包含要在每個輸出記錄末尾列印的字串的內置變數(在本例中為記錄 = 行),默認為換行符。RS是包含分隔每個輸入記錄的字串(或正則運算式)的內置變數,默認為換行符。NR是包含當前記錄/行號的內置變數,奇數記錄也是如此,偶數記錄是 0NR%2。1NR%2 ? "," : RS是一個三元運算式,導致,奇數行,\n(或您設定的任何其他內容RS,例如\r\n)偶數行。1是一個真條件,它會導致執行列印當前記錄的默認操作。
所以上面的腳本說“如果當前行號是奇數,在最后用 a,列印,否則在最后用換行符列印它”,因此它將每對線與一個,之間連接起來。
uj5u.com熱心網友回復:
重擊
你可以做一個paste(感謝@glenn jackman 指出我以前對 的無用使用cat)。
# or cat mytext.txt | paste -d "," - -
paste -d "," - - < mytext.txt
Viruses/GCF_000820355.1_ViralMultiSegProj14361_genomic.fna.gz,Sclerophthora macrospora virus A
Viruses/GCF_000820495.2_ViralMultiSegProj14656_genomic.fna.gz,Influenza B virus RNA
Viruses/GCF_000837105.1_ViralMultiSegProj14079_genomic.fna.gz,Tomato mottle virus
R
R 函式也是paste,與 一起sapply:
mytext <- scan("mytext.txt", character(), sep = "\n")
sapply(seq(1, length(mytext), 2), function(x) paste(mytext[x], mytext[x 1], sep = ","))
[1] "Viruses/GCF_000820355.1_ViralMultiSegProj14361_genomic.fna.gz,Sclerophthora macrospora virus A"
[2] "Viruses/GCF_000820495.2_ViralMultiSegProj14656_genomic.fna.gz,Influenza B virus RNA"
[3] "Viruses/GCF_000837105.1_ViralMultiSegProj14079_genomic.fna.gz,Tomato mottle virus"
uj5u.com熱心網友回復:
使用sed
$ sed '/^Viruses/{N;s/\n\(.*\)/,\1/}' multi_headers
Viruses/GCF_000820355.1_ViralMultiSegProj14361_genomic.fna.gz,Sclerophthora macrospora virus A
Viruses/GCF_000820495.2_ViralMultiSegProj14656_genomic.fna.gz,Influenza B virus RNA
Viruses/GCF_000837105.1_ViralMultiSegProj14079_genomic.fna.gz,Tomato mottle virus
/^Viruses/- 匹配以字串開頭的行Viruses{N;- 將下一行輸入讀取/附加到模式空間中。s/\n\(.*\)/,\1/- 從模式空間中洗掉 \n 并用逗號替換它,
uj5u.com熱心網友回復:
這可能對您有用(GNU sed 和粘貼):
sed 'N;s/\n/,/' file
將下一行附加到當前行并用逗號替換 then 之間的換行符。
或者:
paste -sd',\n' file
將檔案粘貼為一個長字串,用逗號替換所有其他換行符。
uj5u.com熱心網友回復:
那這個呢。
with open('test.txt') as f:
data = f.read().split('\n')
new_data = []
for a in range(0,len(data),2):
new_data.append(data[a] ',' data[a 1] '\n')
with open('result.txt','w') as f:
f.writelines(new_data)
或者
with open('test.txt') as f_read, open('result.txt','w') as f_write:
data = f_read.read().split('\n')
new_data = []
for a in range(0,len(data),2):
new_data.append(data[a] ',' data[a 1] '\n')
f_write.writelines(new_data)
uj5u.com熱心網友回復:
一個簡單的writerows():
import csv
with open("text.txt", "r") as f:
with open("data.csv", "w", newline="") as w:
writer = csv.writer(w)
# May want to add headers
writer.writerow(["Heading1", "Heading2"])
x = f.read().split("\n")
writer.writerows([x[i:i 2] for i in range(0, len(x), 2)])
產生:
Heading1,Heading2
Viruses/GCF_000820355.1_ViralMultiSegProj14361_genomic.fna.gz,Sclerophthora macrospora virus A
Viruses/GCF_000820495.2_ViralMultiSegProj14656_genomic.fna.gz,Influenza B virus RNA
Viruses/GCF_000837105.1_ViralMultiSegProj14079_genomic.fna.gz,Tomato mottle virus
uj5u.com熱心網友回復:
另一種 R 方法,依賴于向量回收。
t = readLines("txt.txt")
paste0(t[c(T, F)], ",", t[c(F, T)]) |> writeLines("txt.csv")
或用于最終檔案名
t = readLines("R/txt.txt")
sub("(?<=\\.\\d).*", "", t, perl = T) |>
(\(.) paste0(.[c(T, F)], "/", .[c(F, T)], ".fna"))()
#> [1] "Viruses/GCF_000820355.1/Sclerophthora macrospora virus A.fna"
#> [2] "Viruses/GCF_000820495.2/Influenza B virus RNA.fna"
#> [3] "Viruses/GCF_000837105.1/Tomato mottle virus.fna"
uj5u.com熱心網友回復:
簡單python3的解決方案,讓file.txt內容成為
Viruses/GCF_000820355.1_ViralMultiSegProj14361_genomic.fna.gz
Sclerophthora macrospora virus A
Viruses/GCF_000820495.2_ViralMultiSegProj14656_genomic.fna.gz
Influenza B virus RNA
Viruses/GCF_000837105.1_ViralMultiSegProj14079_genomic.fna.gz
Tomato mottle virus
和script.py
with open("file.txt","r") as f:
for inx, line in enumerate(f):
print(line.rstrip(), end='\n' if inx%2 else ',')
然后
python script.py
輸出
Viruses/GCF_000820355.1_ViralMultiSegProj14361_genomic.fna.gz,Sclerophthora macrospora virus A
Viruses/GCF_000820495.2_ViralMultiSegProj14656_genomic.fna.gz,Influenza B virus RNA
Viruses/GCF_000837105.1_ViralMultiSegProj14079_genomic.fna.gz,Tomato mottle virus
說明:我.rstrip習慣于拋棄尾隨換行符,然后根據我應用的奇數行或偶數行\n或,分別作為行尾。請注意,enumerate默認值從 0 開始,而 GNUAWK從 1 開始。請注意,在檔案句柄中使用 for ... 確實會阻止一次性加載整個檔案,因此該解決方案也可用于大于可用 RAM 空間的檔案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/471556.html
上一篇:MacOSBash-如何按順序標記大量檔案并將檔案移動到150個檔案塊中的檔案夾中?
下一篇:回聲和終端中的可變擴展
