단일 텍스트 파일에는 쉘 또는 bash 스크립트를 사용하는 여러 작업이 필요합니다

단일 텍스트 파일에는 쉘 또는 bash 스크립트를 사용하는 여러 작업이 필요합니다

내 소스 파일: Test.txt

참고: 파일은 탭으로 구분되어 있으며 일부 열에는 열 이름이 없습니다.

Chr  Start  End   Alt   Value
Exo  0      10    .     1.50    .   20:-2     30:0.9    50:50   50
Exo  1      20    .     1.50    .   20:-1     30:-1     50:50   50
Exo  2      30    .     1.50    .   20:0.02   30:0.9    50:50   50
Exo  3      40    .     1.50    .   20:-1     30:-2     50:50   50
Nem  3      40    .     1.50    .   20:-1     30:-2     50:50   50

위 파일에 대해 다음 파일 작업을 구현해 보세요. 예를 들면 다음과 같습니다.

1) 7열과 8열을 분할해야 합니다.':'그리고 변경 후에는 "mod1", "mod2", "mod3", "mod4"와 같은 열 이름을 지정해야 합니다.

2) 그런 다음 분할 열을 "값" 열 옆으로 이동하고 "mod4" 옆에 "설명" 열을 하나 더 배치합니다(이 설명 열에는 빈 데이터가 필요합니다).

3) 필터 열 "Mod2"에서 0.01보다 큰 값은 모두 삭제됩니다.

최종 결과는 출력 폴더에 저장되어야 합니다.:

Chr  Start  End   Alt  Value  mod1  mod2  mod3  mod4  comment 
Exo  0      10    -1   1.50   20    -2    30    0.9           -1  50:50  50
Exo  1      20    -1   1.50   20    -1    30    -1            -1  50:50  50
Exo  3      40    -1   1.50   20    -1    30    -2            -1  50:50  50

다음을 시도하고 일부 작업을 구현했는데 그 중 일부가 남아 있습니다.

#!bin/bash

cd /home/uxm/Desktop/Shell/

# Replace the only dots (.) by -1

awk -F'\t' '{for(i=1;i<=NF;i++){sub(/^\.$/,"-1",$i)}} 1' OFS="\t" Test.txt | tail >> Test1.txt

# splitted 7th no column by delimitted ":" 

awk '{ split($7, a, ":"); print $1"\t"$2"\t"$3"\t"$4"\t"$5"\t"$6"\t"a[1]"\t"a[2]"\t"$8"\t"$9"\t"$10"\t"$11 >> "testfile1.tmp"; }' Test1.txt;
mv testfile1.tmp Test2.txt;

# splitted 8th no column by delimitted ":" 

awk '{ split($9, a, ":"); print $1"\t"$2"\t"$3"\t"$4"\t"$5"\t"$6"\t"$7"\t"$8"\t"a[1]"\t"a[2]"\t"$10"\t"$11 >> "testfile2.tmp"; }' Test2.txt;
mv testfile2.tmp Test3.txt;

# Give name to splitted columns

awk -F'\t' -v OFS="\t" 'NR==1{$11="nCol\tMod1\tMod2\tMod3\tMod4"}1' Test3.txt >> Test4.txt

# Filter data by "Exo" word 

awk -F'\t' 'NR==1;{ if($1 == "Exo") { print }}' Test4.txt | tail >> Test5.txt

답변1

awk다음은 나열된 단계를 수행하는 스크립트 입니다 . 하나의 스크립트에서 모든 작업을 수행 awk하면 여러 번 실행하고 중간 결과를 파일이나 변수에 저장할 필요가 없다는 이점이 있습니다 .

BEGIN { OFS = FS = "\t" }
NR == 1 {
    # Add new column headers

    # First four "mod" headers
    for (i = 1; i <= 4; ++i)
        $(NF + 1) = "mod" i

    # Then a "comment" header
    $(NF + 1) = "comment"

    # Output and continue with next input line
    print
    next
}

# Ignore lines that don't have "Exo" in the first column
$1 != "Exo" { next }

{
    # Working our way "backwards" from column 13 down to 1

    # Shift the last two columns right by three steps
    $13 = $10
    $12 = $9

    # Set column 11 to column 6, or to -1 if it's a dot
    if ($6 == ".")
        $11 = -1
    else
        $11 = $6 

    # Empty the comment column
    $10 = ""

    # Move column 8 into column 9
    $9 = $8

    # Split column 9 into columns 8 and 9
    split($9, a, ":")
    $9 = a[2]
    $8 = a[1]

    # Split column 7 into columns 6 and 7
    split($7, a, ":")
    $7 = a[2]
    $6 = a[1]

    # Column 5 remains unmodified

    # Put -1 in column 4 if it's a dot
    if ($4 == ".") $4 = -1

    # Columns 1, 2, 3 remains unmodified   
}

# Output if we want this line
$7 <= 0.01 { print }

실행하세요:

$ awk -f script.awk Test.txt
Chr     Start   End     Alt     Value   mod1    mod2    mod3    mod4    comment
Exo     0       10      -1      1.50    20      -2      30      0.9             -1      50:50   50
Exo     1       20      -1      1.50    20      -1      30      -1              -1      50:50   50
Exo     3       40      -1      1.50    20      -1      30      -2              -1      50:50   50

나는 여러분의 코드에서 여러분이 Exo이 줄에만 관심이 있다고 가정하고 있으므로 스크립트에서 해당 줄만 보도록 했습니다. 나는 Alttha 열(및 원래 이름이 지정되지 않은 첫 번째 열)의 모든 지점을 로 변경해야 -1하며 코드를 보고 변경할 수도 있다고 가정합니다 .

관련 정보