小编Jam*_*own的帖子

asort(src,dest)到一个多维数组

我试图滥用asort()(只是因为)将数组复制src到数组dest,没有问题:

$ awk 'BEGIN {
    split("first;second;third",src,";") # make src array for testing
    asort(src, dest, "@ind_num_asc")    # copy array to dest
    for(i in dest) 
        print i, src[i], dest[i]        # output
}'
1 first first
2 second second
3 third third
Run Code Online (Sandbox Code Playgroud)

但有没有办法使用多维数组作为dest数组?就像是:

asort(src, dest[src[1]], "@ind_num_asc") # or dest[src[1]][]

(前者产生second argument not an array,后者syntax error 实际上第一个论点split$0,我正在尝试将记录分组.)

当然我可以使用for循环但我的大脑仍然坚持测试这个解决方案.

arrays sorting awk gawk multidimensional-array

5
推荐指数
1
解决办法
156
查看次数

关于 awk 和整数到 ASCII 字符的转换

只是为了确定,使用 awk (至少是 Gnu awk)我真的可以转换:

从八进制到 ASCII:

print "\101"         # or a="\101"
A
Run Code Online (Sandbox Code Playgroud)

从十六进制到 ASCII:

print "\x41"         # or b="\x41"
B
Run Code Online (Sandbox Code Playgroud)

但从十进制到 ASCII 我必须:

$ printf "%c\n", 67  # or c=sprintf("%c", 67)
C
Run Code Online (Sandbox Code Playgroud)

print "\?67"我错过的 RTFM(备忘录)中没有秘密吗?

我正在尝试从以下位置获取字符频率$0="aabccc"

for(i=141; i<143; i++) a=a gsub("\\"i, ""); print a
213
Run Code Online (Sandbox Code Playgroud)

但使用十进制(而不是上面示例中的八进制)。十进制方法看起来非常长:

$ cat foo
aabccc
$ awk '{for(i=97;i<=99;i++){c=sprintf("%c",i);a=a gsub(c,"")} print a}' foo
213
Run Code Online (Sandbox Code Playgroud)

就用在这里了。

awk gawk

5
推荐指数
1
解决办法
7426
查看次数

Bash和文件命令样本大小

我正在编写一个bash脚本来自动处理一些文件,iconv如果不喜欢,我们会使用一个subjob 来重新编码源文件.为此,我使用:

enc=$(file -b --mime-encoding "$file")                   # get the encoding

if [ "$enc" = "iso-8859-1" ] || [ "$enc" = "us-ascii" ]  # no need to encode these
then                                                     
    unset enc
fi

cat "$file" |                                            # conditional encoding below
    ( [[ "${enc}" ]] && iconv -f "$enc" -t iso-8859-1 || cat ) |
    awk '{# code to process file further}' > "$newfile"
Run Code Online (Sandbox Code Playgroud)

问题是我有一个UTF8文件,但file错误地将其识别为ASCII.第一个非ASCII字符是字符#314206,它在第#1028行.显然有一些样本大小file,例如,如果我将文件从固定宽度转换为字符分隔,则第一个非ASCII字符是char#80872并file正确识别文件编码.所以我猜有一个样本大小介于这两个值之间.

(TL; DR)有没有办法指示file采取更大的样本或读取整个源文件,或其他一些bash友好的方式来找出编码?

我玩了file -P …

bash

4
推荐指数
1
解决办法
58
查看次数

带多线程的 Grep

我有以下(大)文件,其中包含 30233088 个字符串:

head mystringfile.txt:

GAATGAACACGAAGAA
GAATGAACACGAAGAC
GAATGAACACGAAGAG
GAATGAACACGAAGCA
Run Code Online (Sandbox Code Playgroud)

cat sequence.txt

AAATAGAGGGCGGTCCAGGCGTGTCGAAACACTGGGTCCAGGGCAAGAGCGGTTCGGGTGTCAGGAAAGCCCCCAAGGGGGTTCGCGCGGTTTGCAGTGAGGTAGAGGCCGGTGTATGGGTAGACAATTGGGGTCCCAAAGAAAAAGGCTCGTCCAACATCATAATAAACCCAAGCACGATAAAAAGCAAACGCAGACTTCAATAGGGTACGAGCAATTGTGGCAGGGTGCTCGCTGTCAGGGTTAGATCTTCTTGGAGTCGCGTCGCTCGGGGGGGCAAGGCCAACGTAAGATCGTGGCTGATCGCTGGCAATGCGGTCGGTTGGGTGGTCGCTAGTAGGGGCACGGCGGTCTCTTATGGCGTCGTAAAATGCGTCTCCAAAGCGAAAAGGGGCGGCAGACAAGTCACCGGGCAAGCTTAGAGGTCTGGGGCCCGTGGCTTTAGGGGAATGAACACGAAGACGCGAAACGAAGTCGTGTTTCTTGTTGGCTGTAGAGGGGAAAACCGTCTGGGGCGATCTGGCGTAGTAGTGCGTGTCTTGCAGTGAGCTCCCCGTCCGTAAGGATTCGCAGGAATCCTGCGTGAAGCTCGGTCGTCTCGGCCGTGTCTCGGGGTTTGATTGCGGGTTCAGATTGGAAAGGTCTCCTCGGGTCGTTTGCTGCATTTGCTCGCAACCCTGACGTGAAAGGGGTGAGCTGTCTCCAATCTGCCACGCTGGGTGTTGCGTCGTCAGTAAAAGACTTGGTCAAGCTGGGACCTCGCAAGATCGCGAGAGGGTTAAGCACAAAAGGTATGGCGAAGCTCCCGGGTGCTCTTGTGGCCACCCAGAATCATGGTGACGTAGGTTTTGCGAAGCCATCAAAAATTCAGGCGGCAAAACGAGCCAGTAGGGTCCTGGGCAGCTGGGCTTGTAGTGGGTAGGCGGCAAAACGCAAAGAATGAACACGAAGCAACTCCGTAGTGTGACGGGGGTTCTGACAAACGTCCTGCAAGAAGTTCGTCTTGGG
Run Code Online (Sandbox Code Playgroud)

我需要grep在另一个序列文件中确定匹配的位置,我执行以下操作:

while read line; do grep -b -o $line sequence.txt >>sequence.txt.count; done<mystringfile.txt
Run Code Online (Sandbox Code Playgroud)

像这样运行代码当然需要很长时间并且只运行 1 个线程的一部分,那么我如何修改它(使用parallelxargs?),以便它在我想要指定的尽可能多的线程上运行?

parallel-processing awk grep xargs

4
推荐指数
1
解决办法
3102
查看次数

如果下一行匹配,则使用 awk 打印行 + 下两行

我有一个这样的列表来捕获 joomla 版本

./somedir/bla/old/libraries/cms/version/version.php
        public $RELEASE = '2.5';
        public $DEV_LEVEL = '24';
./somedir/bla3/www/libraries/cms/version/version.php
        public $RELEASE = '2.5';
        public $DEV_LEVEL = '9';
./somedir/bla4/www/libraries/cms/version/version.php
./somedir/bla5/www/w/scripts/version.php
./somedir/bla6/www/libraries/cms/version/version.php
./somedir/bla7/www/libraries/cms/version/version.php
        public $RELEASE = '2.5';
        public $DEV_LEVEL = '9';
Run Code Online (Sandbox Code Playgroud)

public我想要的是,如果位于下一行,则仅显示该行+接下来的两行。else 行必须被忽略

所以结果应该是:

./somedir/bla/old/libraries/cms/version/version.php
        public $RELEASE = '2.5';
        public $DEV_LEVEL = '24';
./somedir/bla3/www/libraries/cms/version/version.php
        public $RELEASE = '2.5';
        public $DEV_LEVEL = '9';
./somedir/bla7/www/libraries/cms/version/version.php
        public $RELEASE = '2.5';
        public $DEV_LEVEL = '9';
Run Code Online (Sandbox Code Playgroud)

我尝试过使用 awk 和这个 awk 脚本

BEGIN{ RS=""; FS="\n" }
 /public/ {
    for (i=1; i<=NF; i++) { …
Run Code Online (Sandbox Code Playgroud)

awk

3
推荐指数
1
解决办法
1060
查看次数

将多对线更改为单行?

我想打印/回显或重定向下面的行到一些文件

phone: "3434343"
name: "jack"

phone: "9876735"
name: "john"

phone: "3434343"
name: "Mack"


...multiple emptylines ...


phone: "9876735"
name: "doe"

phone: "3434343"
name: "tack"
Run Code Online (Sandbox Code Playgroud)

所需的输出线是: -

phone: "3434343" name: "jack"
phone: "9876735" name: "john"

 ...
Run Code Online (Sandbox Code Playgroud)

以下是我写的内容

cat /tmp/sip_summary2.log | while  read LINE; 
do
echo $LINE | grep '^$' > /dev/null
    if [ $? -eq 0 ]
        then
      echo " " >> /tmp/tempsip.log 
    else
      printf "%s " "$LINE" >> /tmp/tempsip.log
    fi
done
Run Code Online (Sandbox Code Playgroud)

这有更好或更清洁的替代品吗?

bash awk sed

3
推荐指数
1
解决办法
136
查看次数

列表处理,将列表转换为撇号和逗号分隔的记录,用括号括起来

我在名为Target_id_convert.txt的文件中有一个列表

70S ribosome
ALK tyrosine kinase receptor
ATP
ATP synthase
Run Code Online (Sandbox Code Playgroud)

期望的输出

('70S ribosome','ALK tyrosine kinase receptor','ATP','ATP synthase')
Run Code Online (Sandbox Code Playgroud)

我写了这段代码

sed -e "s/'/'\\\\''/g;s/\(.*\)/'\1'/" Target_id_convert.txt  > Target_id_convert1.txt
tr '\n' ',' < Target_id_convert1.txt > Target_id_convert_output.txt
Run Code Online (Sandbox Code Playgroud)

然后我必须手动编辑文件并在Target_id_convert_output.txt文件中添加(),请让我知道如何有效地完成所有操作,因为它应该是自动化的.

bash awk

2
推荐指数
1
解决办法
102
查看次数

如何删除文本文件中的特定文本

我有一个文本文件:

192.168.47.100 computer
192.168.47.101 phone
192.168.47.1 computer3
192.168.47.50 computer2
Run Code Online (Sandbox Code Playgroud)

我想删除192.168.47.1

我试过了

while read line
do
    IPTemp="$line"
    ex -s +"g/$IPTemp/d" -cwq $1
done < IPLib.txt
Run Code Online (Sandbox Code Playgroud)

但输出是:

192.168.47.50 computer 3
Run Code Online (Sandbox Code Playgroud)

我试过sed 's/192.168.47.1//g'但是再次输出是:

00 computer
01 phone
computer3
192.168.47.50 computer2
Run Code Online (Sandbox Code Playgroud)

我在谷歌搜索,但我找不到合适的.

linux bash awk

2
推荐指数
1
解决办法
96
查看次数

AWK 十进制转二进制

我想使用 AWK 将文件中的十进制数字列表转换为二进制,但似乎没有内置方法。示例文件如下:

134218506
134218250
134217984
1610612736
16384
33554432
Run Code Online (Sandbox Code Playgroud)

binary awk decimal

2
推荐指数
1
解决办法
967
查看次数

在linux中创建带有文件绝对路径的文件列表

我有大量文件(约 50000 个文件)。

ls /home/abc/def/

file1.txt
file2.txt
file3.txt
.........
.........
file50000.txt
Run Code Online (Sandbox Code Playgroud)

我想创建一个包含两列的 CSV 文件:第一列提供文件名,第二列提供绝对文件路径,如下所示:

输出.csv

file1.txt,/home/abc/def/file1.txt
file2.txt,/home/abc/def/file2.txt
file3.txt,/home/abc/def/file3.txt
.........................
.........................
file50000.txt,/home/abc/def/file50000.txt
Run Code Online (Sandbox Code Playgroud)

如何使用 bash 命令执行此操作。我尝试使用 ls 并找到

find /home/abc/def/ -type f -exec ls -ld {} \; | awk '{ print $5, $9 }' > output.csv
Run Code Online (Sandbox Code Playgroud)

但这给了我绝对路径。如何获得如上面的output.csv所示的输出

unix bash awk

1
推荐指数
1
解决办法
275
查看次数