我的目標是通過 AH B 將具有 2 1 0 的檔案轉換為具有 1 0 -1 的檔案。例如,
Infile.txt Temp.txt Final.txt
2 2 2 1 1 1 0 0 A A A H H H B B 1 1 1 0 0 0 -1 -1
我能夠使用以下代碼將數字(2 1 0)轉換為字符(AHB):
cut -f2- Infile.txt | sed '1,1d' | sed 's/2/A/g' | sed 's/1/H/g' | sed 's/0/B/g' > Temp.txt
但是,我無法從 (AHB) 轉換為 (1 0 -1)。因此,我陷入了 Temp.txt
因此,我將不勝感激任何解決方案。謝謝!
uj5u.com熱心網友回復:
你真的需要臨時部分嗎?您只需一點點即可在 3 之間進行完美映射regex gsub():
echo '2 1 1 1 0 1 2 1 1 2 0 2 0 2 1 2 1 0 1 0 0 1 2 1 0 2 2 2 2 1 0 0 2 2 0 2 0 2 0 1 2 0 1 1 0 2 0 1 1 1 0 0 2 0 0 2 1' |
mawk '{ print }
gsub( _,__) gsub(!_, _) gsub(__,"-"!_) \
gsub(!_ !_,!_)^_' __='\2' |
gtee >( gpaste - | column -t | gsed -zE 's/^|\n/&\n/g' >&2;) |
mawk NF=NF FS='[^0-9-] ' OFS='\n' | nonEmpty | rs -t -c$'\n' 0 2 | uniqC
2 1 1 1 0 1 2 1 1 2 0 2 0 2 1 2 1 0 1 0 0 1 2 1 0 2 2 2 2 1 0 0 2 2 0 2 0 2 0 1 2 0 1 1 0 2 0 1 1 1 0 0 2 0 0 2 1
1 0 0 0 -1 0 1 0 0 1 -1 1 -1 1 0 1 0 -1 0 -1 -1 0 1 0 -1 1 1 1 1 0 -1 -1 1 1 -1 1 -1 1 -1 0 1 -1 0 0 -1 1 -1 0 0 0 -1 -1 1 -1 -1 1 0
19 0 -1
19 1 0
19 2 1
uj5u.com熱心網友回復:
OP 在評論中提到源檔案是一個 20,000 x 500(行 x 列)的數字矩陣2,1并且0.
創建一個 20000 x 501(行 x 列)矩陣:
awk '
BEGIN { for (i=1;i<=20000;i ) {
sep=""
for (j=1;j<=167;j ) {
printf "%s2 1 0", sep
sep=" "
}
print ""
}
}
' > matrix.dat
$ head -5 matrix.dat | cut -c1-30
2 1 0 2 1 0 2 1 0 2 1 0 2 1 0
2 1 0 2 1 0 2 1 0 2 1 0 2 1 0
2 1 0 2 1 0 2 1 0 2 1 0 2 1 0
2 1 0 2 1 0 2 1 0 2 1 0 2 1 0
2 1 0 2 1 0 2 1 0 2 1 0 2 1 0
一個awk/gsub()想法:
awk '{ gsub(/1/,9)
gsub(/2/,1)
gsub(/0/,-1);
gsub(/9/,0)
}
1
' matrix.dat > matrix.awk1.out
一個awk/loop想法:
awk '{ for (i=1;i<=NF;i )
$i=$i-1
}
1
' matrix.dat > matrix.awk2.out
一個sed想法:
sed 's/1/9/g;s/2/1/g;s/0/-1/g;s/9/0/g' matrix.dat > matrix.sed.out
這些都產生相同的結果:
$ diff matrix.awk1.out matrix.awk2.out
$ diff matrix.awk2.out matrix.sed.out
$ head -5 matrix.awk1.out | cut -c1-35
1 0 -1 1 0 -1 1 0 -1 1 0 -1 1 0 -1
1 0 -1 1 0 -1 1 0 -1 1 0 -1 1 0 -1
1 0 -1 1 0 -1 1 0 -1 1 0 -1 1 0 -1
1 0 -1 1 0 -1 1 0 -1 1 0 -1 1 0 -1
1 0 -1 1 0 -1 1 0 -1 1 0 -1 1 0 -1
運行時間:
- 系統:(
cygwin在虛擬機中)awk 5.1.1,,sed 4.8 - 5.5 秒:
awk/gsub() - 3.9 秒:
awk/loop - 5.9 秒:
sed
uj5u.com熱心網友回復:
用于scan讀取數字檔案,減去1并寫入檔案。
{scan(text = "2 2 2 1 1 1 0 0") - 1L} |> as.character() |> writeLines("~/Temp/Final.txt")
使用reprex v2.0.2創建于 2022-10-16
編輯
這是一種讀取數字矩陣、減 1 并寫入結果的方法。
infile <- "~/Temp/Infile.txt"
x <- scan(infile, nlines = 1)
nc <- length(x)
x <- scan(infile) - 1L
write.table(matrix(x, ncol = nc), "~/Temp/Final.txt",
quote = FALSE, row.names = FALSE, col.names = FALSE)
rm(x) # final clean up
uj5u.com熱心網友回復:
tr是一個公平的選擇,但不喜歡輸出雙符號 '-1'
tr "012" "-01" 輸入
應該在 shell 中輸入幾個字符時的翻譯速度與您的翻譯速度一樣快。您可以將結果通過管道傳輸到sed
sed 's/-/-1/g'
擴大代表性
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/515263.html
上一篇:如何在R中簡化此代碼?確定最受歡迎的流派并計算每個流派中的流總數
下一篇:在回圈中創建圖(R)
